如何创建已知类型的类文字:Class>
考虑以下内容:
public Class<List<String>> getObjectType() {
// what can I return here?
}
我可以从此方法返回什么类文字表达式来满足泛型并进行编译? List.class
不会编译,List.
也不会编译。
如果您想知道“为什么”,我正在编写 Spring 的 FactoryBean
的实现,它要求我实现 >
Class
> getObjectType()。然而,这不是 Spring 问题。
编辑: SpringSource 的掌权者已经听到了我的哀声,因此 Spring 3.0.1 将把 getObjectType()
的返回类型更改为 Class
,巧妙地避免了这个问题。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
你总是可以投射到你需要的东西,比如
或
但我认为这不是你想要的。嗯,它可以工作,但有一个警告,但它并不完全“漂亮”。
我刚刚发现这个:
所以选角可能是唯一的出路。
You can always cast to what you need, like
or
But I assume that's not what you are after. Well, it works, with a warning, but it isn't exactly "beautiful".
I just found this:
So casting might be the only way to go.
您永远不应该使用构造
Class
。这是无意义的,并且应该在 Java 中产生警告(但没有)。类实例始终代表原始类型,因此您可以使用>
Class
;就是这样。如果您想要某种东西来表示像List
这样的具体化泛型类型,您需要一个像 Guice 使用的“超级类型标记”:http://google-guice.googlecode.com/git/javadoc/com/google/inject/TypeLiteral.html
You should never use the construct
Class<List<String>>
. It is nonsensical, and should produce a warning in Java (but doesn't). Class instances always represent raw types, so you can haveClass<List>
; that's it. If you want something to represent a reified generic type likeList<String>
, you need a "super type token" like Guice uses:http://google-guice.googlecode.com/git/javadoc/com/google/inject/TypeLiteral.html
您可以像这样实现该方法:
You can implement that method like this:
Class
的存在本质上是危险的。原因如下:>
The existence of a
Class<List<String>>
is inherently dangerous. here's why:在 springframework.org 上找到此链接,它提供了一些见解。
例如
Found this link on springframework.org which gives some insight.
E.g.
查看 SUN 论坛上的讨论:
http://forums.sun.com/thread .jspa?threadID=5253007
以及引用的博客文章,描述了使用“超级类型令牌”的解决方法:
http://gafter.blogspot.com/2006/12/super-type-tokens.html
Check out this discussion on the SUN forums:
http://forums.sun.com/thread.jspa?threadID=5253007
And the referenced blog post that describes a work around by using "super type tokens":
http://gafter.blogspot.com/2006/12/super-type-tokens.html
我不确定这是否可能,因为任何类文字都将被编译为 Class.forName(...) 并且由于这种情况发生在运行时,因此没有留下通用信息。
I'm not sure if this is possible at all, since any class literal will be compiled to
Class.forName(...)
and since this happens at runtime there is no generic information left.这个怎么样:
这个打印:
What about this:
This prints:
以下方法是有问题的:
例如,如果您想测试类型的对象是否
类型
是基于上述 getModelType() 方法的结果的
,例如:它将导致 false,而它应该为 true,因为两个对象都实现接口 List(因为 getModelType() 返回 List 类型的 Class 对象,而不是 ArrayList)。
这是一种对我有用的方法(有点麻烦,但在上面的示例中会产生正确的结果,可以移动到静态初始化程序):
The following approach is problematic:
e.g. if you want to test whether an object say of type
is of type
based on the result of the aforementioned getModelType() approach, for example:
it will result in false whereas it should be true because both objects implement the interface List (since getModelType() returns a Class object of type List and not ArrayList).
Here is an approach that worked for me (a bit cumbersome but leads to correct results in the example above, could be moved to a static initializer):