java - 为什么这个带有泛型返回的方法不能正确使用泛型类型?

标签 java generics

我有一些代码需要多次使用,所以我想将其放入一个方法中。代码是:

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/

相关文章:

java - 为什么下面的代码会导致 javac 崩溃?可以做些什么呢?

generics - 使用泛型取消引用强制

java - 我为指数编写的这个基本程序仅适用于整数 - 我做错了什么?

java - HtmlUnit 在 getbyxpath 内运行 getbyxpath

java - 如何使用Java打开Excel表格?

java - 如果配置文件不在当前目录中,MaltParser 无法找到配置文件

c# - 有没有一种方法可以使用对象的形状而不是继承来对通用函数参数进行类型检查?

java - 为什么 Java 强制强制转换泛型类型?

java - 从方法返回泛型

java - JSONObject 无法转换为 java.lang.String