gpt4 book ai didi

Java 将 List 作为 Class 传递,想要知道列表的类型

转载 作者:行者123 更新时间:2023-12-02 08:28:24 25 4
gpt4 key购买 nike

我有一个关于泛型的问题。

我有一个函数,它知道我想要创建的对象的类类型:

public static <T> XmlParserInterface<T> createXmlParser(Class<T> rootType, String currentTagName) {
XmlParserInterface<T> result = null;

if (rootType.equals(List.class)) {
result = new XmlParserList<T>();
}
// ...

result.init(rootType, currentTagName);
return result;
}

在该函数中,对于这种特殊情况,我用 rootType 来调用它是List<String> .

在我的init函数,我再次传递 rootType这样我就可以创建一个 ArrayList<something> 。我的问题是找到 something因为我需要它来生成更多对象。在这种情况下,它将是 String ,但如果是 List<List<String>> 则可以更深入。甚至是我检查其 set 的自定义 POJO函数来填充它们。

我尝试做 rootType.getTypeParameters()[0] ,但它只返回我 E 。我需要知道 E 的实际类别.

如果有人能回答的话,谢谢:)

最佳答案

您需要显式添加类型信息 - 它在运行时不可用,因为泛型类型参数在编译期间被删除。而且由于您需要明确指定这一点,因此您无法仅使用泛型来做您想做的事情(据我所知)。相反,您需要进行一些转换(并传递某种类结构来指示您想要构造的内容)。

请参阅 Wadler 撰写的有关 Java 泛型的优秀书籍(实际上,如果您尝试编写这样的代码,则需要购买并阅读该书)。

如果你总是有,比如 List 那么你可以这样做(你仍然需要扩展签名,但代码将在没有任何类型警告的情况下编译)。或者甚至是 X ,其中 X 本身就是一个变量,例如,List 的子类。您不能做的是在不强制系统执行“不安全”操作的情况下同时处理 X 和 X >。

X 的情况看起来像这样:

public <Y, X extends List<Y>> X<Y> myMethod(Class<X<Y>> xClass, Class<Y> yClass, ...) { ...}

(这只是凭内存,但我希望你能明白这个想法 - 你传递了 X 和 Y,并且使用限定类型注释来表达它们之间的关系。真的,请阅读 Wadler 的书!)。

如果您想手动强制执行操作,则只需传入不带类型的 Class 值列表,并添加大量转换。

关于Java 将 List<String> 作为 Class<T> 传递,想要知道列表的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4004952/

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