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