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は、アノテーションに渡されるコンパイル時定数である別の問題を指摘しました。このスレッドの応答を見てください、それらは役に立つかもしれません。それらの1つは、回避策としてENUMを提案しています。 注釈で配列定数を使用する方法

于 2012-11-14T14:53:59.757 に答える
1

- - アップデート - -

問題は注釈に起因しているようです。アノテーションにはコンパイル時定数が必要です。つまり、アレイを再割り当てしたり、アノテーション付きメソッドがアクセスする前に配列を変更したりするような方法でクラスの「配列を構築」することはできません。

明らかなことを指摘してくれたartbristolの功績。最初、私は間違った道を歩み始めました。それは、あなたのアレイが私の1.7環境でコンパイルされた理由を見つけようとすることでした。

実際、アノテーションのコンパイル時定数の制限は、アノテーションが宣言型の手段を介してJavaプログラミングを拡張することを意図していることを考えると完全に理にかなっています。

---元の投稿---

ワイルドカードを使用する代わりに、

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

Objectすべてが;から拡張されるため、ジェネリックスの目的を半ば無効にします。しかし、それはあなたが必要とする「それに何かを押し込む」要件を満たします。

于 2012-11-14T14:56:00.267 に答える