1

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

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

3 回答 3

4

不幸的是你不能。注释需要采用编译时常量,因此您必须使用 { MyClass.class, MyNewClass.class }.

于 2012-11-14T14:51:22.117 回答
1

来自“SCJP 学习指南”的 K.Sierra: “请记住,通配符只能用于引用声明(包括参数、变量、返回类型等)。它们不能用作类型参数“你创建了一个新的类型化集合。考虑一下——虽然引用可以是抽象的和多态的,但创建的实际对象必须是特定类型的。”

List<?> foo = new ArrayList<? extends Animal>();

问题:您不能在对象创建中使用通配符表示法。所以新的 ArrayList() 不会编译。

编辑:@artbristol 指出了另一个问题,即传递给注释的编译时常量。查看此线程中的响应,它们可能会有所帮助。其中一个建议将 ENUM 作为一种解决方法。 如何在注解中使用数组常量

于 2012-11-14T14:53:59.757 回答
1

- - 更新 - -

问题似乎源于注释。注释需要编译时常量,这意味着您不能以可能让您重新分配数组或在带注释的方法可以访问它之前对其进行修改的方式“构建一个数组”类。

感谢 artbristol 指出了显而易见的事实。最初我走错了路,试图找出你的数组在我的 1.7 环境中编译的原因。

实际上,当考虑到 Annotations 旨在通过声明性方式扩展 java 编程时,对 Annotations 的编译时间常数限制非常有意义。

--- 原帖 ---

不要尝试使用通配符,而是使用

 Class<Object>[] classArray = new Class<Object>[] { .... };

它半破坏了泛型的目的,因为一切都从Object; 但是,它将满足您需要的“将任何东西推入其中”的要求。

于 2012-11-14T14:56:00.267 回答