我有一些代码需要多次使用,所以我想将其放入一个方法中。代码是:
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
的类型信息。
通常,TypeToken
用于捕获该类型信息,但实例化它很冗长,并且在您的情况下,您已经知道一些信息,即您有一个 List
某种类型。
因此,您可以创建一个实用程序方法,以创建一个 ParameterizedType
,其中 ArrayList
作为原始类型,并使用任意 Type
作为类型参数:
public static ParameterizedType listTypeWith(Type t) {
Type[] actual = { t };
return new ParameterizedType() {
@Override
public Type getRawType() {
return ArrayList.class;
}
@Override
public Type getOwnerType() {
return null;
}
@Override
public Type[] getActualTypeArguments() {
return actual;
}
};
}
然后你可以像这样使用它:
Gson gson = new Gson();
List<MyClass> result = gson.fromJson("[{s:'Hello'}]", listTypeWith(MyClass.class));
System.out.println(result); // [MyClass [s=Hello]]
关于java - 为什么这个带有泛型返回的方法不能正确使用泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44166900/