目前我有以下代码来测试我的课程......
@RunWith(Suite.class)
@SuiteClasses( { MyClass.class, MyNewClass } )
public class AllTests {
public static void suite() {
}
}
我想做的是以下内容,但它在语法上是不正确的 - 什么是正确的格式?...
Class<?>[] classArray = new Class<?>[] {
MyClass.class, MyNewClass.class
};
@RunWith(Suite.class)
@SuiteClasses( classArray )
public class AllTests {
public static void suite() {
}
}
答案 0 :(得分:4)
不幸的是你做不到。注释需要采用编译时常量,因此必须使用{ MyClass.class, MyNewClass.class }
。
答案 1 :(得分:1)
来自“SCJP学习指南”的K.Sierra: “请记住,通配符只能用于参考声明 (包括参数,变量,返回类型等)。它们不能用作 创建新类型集合时键入参数。想一想 - 同时 引用可以是抽象的和多态的,创建的实际对象必须是a 具体类型。“
List<?> foo = new ArrayList<? extends Animal>();
问题:您无法在对象创建中使用通配符表示法。所以 新的ArrayList()将无法编译。
编辑: @artbristol指出了另一个问题,即传递给注释的编译时常量。看看这个帖子中的回复,它们可能会有所帮助。其中一个建议使用ENUM作为解决方法。 How to use an array constant in an annotation
答案 2 :(得分:1)
---更新---
这个问题似乎源于Annotations。注释需要编译时常量,这意味着您不能以可能重新分配数组的方式“构建数组”类,或者在注释方法可以访问它之前修改它。
归功于artbristol指出显而易见的事实。最初我开始走错路,试图找出你的数组在1.7环境中编译的原因。
实际上,当考虑到Annotations是通过声明性方式扩展java编程时,对Annotations的编译时常量限制非常有意义。
---原帖---
不使用通配符,而是使用
Class<Object>[] classArray = new Class<Object>[] { .... };
它彻底破坏了泛型的目的,因为一切都从Object
延伸;但是,它将满足你所需要的“推动任何东西”的要求。