用于SuiteClasses语法的Java JUnit类数组

时间:2012-11-14 14:47:04

标签: java generics junit

目前我有以下代码来测试我的课程......

@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() {        
        }
    }

3 个答案:

答案 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延伸;但是,它将满足你所需要的“推动任何东西”的要求。

相关问题