将Class []转换为泛型?

时间:2008-11-17 21:45:48

标签: java generics

我仍在尝试使用Java的泛型。使用类型集合我没有任何问题,但其余的大部分似乎都让我感到厌烦。

现在我正在尝试使用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在结束&gt; s上放置了一个红色标记,并表示它在此时期待“无效”。我可以使用泛型来做这件事,还是不应该打扰?

3 个答案:

答案 0 :(得分:6)

您遇到的第一个问题是您应该使用

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

而不是

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

This解释了原因。

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

{ Collection.class, ArrayList.class };

而不是

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

这是因为在执行type erasure之后,运行时会计算XXX.class,因此指定type参数是无用的,因此是禁止的。

我强烈推荐FAQ,我将上面的两个解释与上面的两个解释相关联,以便对Java泛型进行“地球上”的讨论,以澄清大多数问题。

答案 1 :(得分:2)

这是正确的语法:

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

答案 2 :(得分:2)

您可能需要阅读Angelika's FAQ以获取有关为何不允许创建具体参数化类型数组的更多解释。

YC