我有一些代碼需要多次使用,所以我想把它放在一個方法中。該代碼是:爲什麼使用通用類型的泛型返回方法不正確?
try
{
//Create a list descriptor for GSON to use
Type listType = new TypeToken<ArrayList<MyClass>>(){}.getType();
//Get it out as a list
List<MyClass> myClass = gson.fromJson(jsonString, listType);
}
catch (Exception e)
{
e.printStackTrace();
}
我把這個方法,如:
public static <T> List<T> getTypeAsList(String jsonString)
{
try
{
Gson gson = new Gson();
//Create a list descriptor for GSON to use
Type listType = new TypeToken<ArrayList<T>>(){}.getType();
//Get it out as a list
return gson.fromJson(jsonString, listType);
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
我調用該方法,如:
util.<MyClass>getTypeAsList(jsonString);
但是當我這樣做,我得到的錯誤:
com.google.gson.internal.StringMap cannot be cast to MyClass
爲什麼它沒有得到正確的類型?它在第一個代碼中工作,而不是在通用方法中。
當文件被編譯時,類型被擦除,所以它在運行時不知道「T」。但它以某種方式推斷'T'爲'StringMap'。你知道爲什麼嗎 ? – SomeDude
@svasa這不是推斷'StringMap',這只是默認值。它得到一個'ParameterizedType',其中的類型參數是非具體的,它將被稱爲'T',而且gson不能使用它。 –
@JornVernee你知道爲什麼類型被刪除?有什麼方法可以防止它被擦除? –