如何创建已知类型的类文本:类<列表<字符串>>

2022-08-31 14:47:27

采取以下措施:

public Class<List<String>> getObjectType() {
    // what can I return here?
}

我可以从此方法返回什么类文本表达式来满足泛型并编译? 不会编译,也不会编译 。List.classList.<String>class

如果你想知道“为什么”,我正在写一个Spring的实现,这需要我实现。然而,这不是一个春天的问题。FactoryBean<List<String>>Class<List<String>> getObjectType()

编辑:SpringSource的强国已经听到了我平淡的呼喊声,因此Spring 3.0.1的返回类型将更改为,这巧妙地避免了这个问题。getObjectType()Class<?>


答案 1

你总是可以投射到你需要的东西,就像这样

return (Class<List<String>>) new ArrayList<String>().getClass();

return (Class<List<String>>) Collections.<String>emptyList().getClass();

但我认为这不是你所追求的。好吧,它的工作原理,带有警告,但它并不完全“美丽”。

我刚刚发现这个

为什么通配符参数化类型没有类文本?

因为通配符参数化类型没有确切的运行时类型表示形式。

因此,选角可能是唯一的出路。


答案 2

切勿使用构造 。这是荒谬的,应该在Java中产生警告(但没有)。类实例始终表示原始类型,因此您可以拥有 ;就是这样。如果你想让一些东西来表示一个像 ,比如 ,你需要一个“超类型标记”,就像 Guice 使用的那样:Class<List<String>>Class<List>List<String>

http://google-guice.googlecode.com/git/javadoc/com/google/inject/TypeLiteral.html


推荐