2008-11-17 110 views
2

我仍然试图让我的头在使用Java的泛型。我使用类型化的集合完全没有问题,但其余大部分内容似乎都让我难以理解。将Class []转换为泛型?

现在我正在尝试使用JUnit“PrivateAccessor”,它需要一个Class []参数,并为所调用的私有方法提供所有参数类型的列表。在Java 1.4中,我定义为

Class[] args = new Class[] { Collection.class, ArrayList.class }; 

但实际的代码被定义为现在接受的参数

myMethod(Collection<MyClass1> first, ArrayList<MyClass2> second) 

我试图改变args来定义要

Class<? extends Object>[] args = new Class<? extends Object>[] 
{ Collection<MyClass1>.class, ArrayList<MyClass2>.class }; 

但是Eclipse在收盘>上放了一个红色标记,并表示它在那个时候期待“无效”。我可以用泛型做到这一点,还是不应该打扰?

回答

6

你的第一个问题是,你应该使用

Class<?>[] args = new Class[] 

代替

Class<? extends Object>[] args = new Class<? extends Object>[] 

This解释了原因。

你的第二个问题是,你应该使用

{ Collection.class, ArrayList.class }; 

,而不是

{ Collection<MyClass1>.class, ArrayList<MyClass2>.class }; 

这是因为XXX.class是在运行时进行评估,之后type erasure已经执行,所以指定类型论点是无用的,因此被禁止。

我强烈推荐使用FAQ,我已将上述两个解释链接起来,用于阐明大多数问题的“泛型”Java泛型。

2

这是正确的语法:

Class<?>[] paramTypes = new Class[]{ Collection.class, ArrayList.class }; 
2

有关为什么不允许创建具体参数化类型的数组的更多说明,您可能需要阅读Angelika's FAQ

yc

+0

只是注意到我双重链接bdumitriu引用到的链接。但是这个会让你直接知道我们所处的主题。 – yclian 2008-11-18 00:13:37