gpt4 book ai didi

java - 将具有类型参数的类作为Java中泛型方法的类型参数传递

转载 作者:IT老高 更新时间:2023-10-28 20:29:16 26 4
gpt4 key购买 nike

问题总结:我想将带有类型参数的类(例如 ArrayList<SomeClass> )作为类型参数传递给泛型方法。

假设我有一个方法:

    public static <T> T getGenericObjectFromJson(String json, Class<T> genericType){
// details unimportant, basically returns an object of specified type
return JsonParser.fromJson(json, genericType);
}

当然,这种方法对于任何类型的类(class)都非常适用。我可以这样调用方法,例如:

getGenericObjectFromJson(jsonString, User.class)

问题:我发现我不能这样做:

getGenericObjectFromJson(jsonString, ArrayList<User>.class)

从语法上看,这显然是无效的。但是,我不确定我将如何完成这样的事情。我当然可以通过 ArrayList.class ,但是泛型类型的添加使其在语法上不再有效,我想不出办法解决它。

唯一直接的解决方案是这样的(这似乎很愚蠢):

getGenericObjectFromJson(jsonString, new ArrayList<User>().getClass())

然而,无论如何我们最终都会丢失泛型类型,而只是取回一个未知类型的 ArrayList(尽管它可以强制转换)。另外,不必要地实例化一个对象。

到目前为止,我唯一的解决方案是将该方法包装在一个包含可以实例化的泛型类型参数的类中,如下所示:

public class JsonDeserializer<T>...

在这种情况下,getGenericObjectFromJson方法将使用类的泛型类型。

问题:最后,我很好奇为什么我不能传递带有类型参数的类,以及是否有办法完成我试图做的事情。

一如既往,如果这个问题有任何问题,请告诉我。

最佳答案

这在 Java 中实际上是可能的,使用一些“技巧”。不要屈服于 C# 狂热分子的压力! (j/k)

“诀窍”是创建一个扩展泛型类型的类,并通过Type访问父类的类型参数的值由 .getGenericSuperclass() 返回或 .getGenericInterfaces() .

这很麻烦。为了简化我们的生活,Google 已经为我们编写了大部分无聊的代码,并通过 Guava 提供。

检查 TypeToken 类,这正是你想要的。例如:

TypeToken<List<String>> stringListTok = new TypeToken<List<String>>() {};

然后你传递一个 TypeToken<T>而不是 Class<T>就这样。它为您提供了对 T 表示的类型进行反射的方法。

这只是在内部调用 .getClass().getGenericSuperclass() (或 ...Interfaces() ),然后是来自 Type 的一些丑陋的类型转换至ParameterizedType并从那里检索所有信息(.getActualTypeArguments() 等)。

最后,如果你想用依赖注入(inject)做类似的事情(即假设你需要在一个类的构造函数上注入(inject)一个Class<T>,或者你想得到某个参数化接口(interface)的实例,其中的实例应该取决于类型参数),Google Guice(来自 Google 的 DI 容器)有一个非常相似的机制来解决这个问题,称为 TypeLiteral .使用和幕后代码与TypeToken 几乎相同来自 Guava 。在这里查看: TypeLiteral

关于java - 将具有类型参数的类作为Java中泛型方法的类型参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18471701/

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