gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:54:16 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com