5

次のコードがコンパイルされます。

import java.util.ArrayList;

public class ClassTest
{
  private ArrayList<Class<? extends Interface1>> testClass = 
    new ArrayList<Class<? extends Interface1>>();

  private interface Interface1 {}
}

ただし、次のコードでは 6 つのエラーが発生します。

import java.util.ArrayList;

public class ClassTest
{
  private ArrayList<Class<? extends Interface1 & Interface2>> testClass = 
    new ArrayList<Class<? extends Interface1 & Interface2>>();

  private interface Interface1 {}
  private interface Interface2 {}
}

エラー:

ClassTest.java:5: > expected
  private ArrayList<Class<? extends Interface1 & Interface2>> testClass = 
                                              ^
ClassTest.java:5: ';' expected
  private ArrayList<Class<? extends Interface1 & Interface2>> testClass = 
                                                           ^
ClassTest.java:5: <identifier> expected
  private ArrayList<Class<? extends Interface1 & Interface2>> testClass = 
                                                                       ^
ClassTest.java:6: > expected
    new ArrayList<Class<? extends Interface1 & Interface2>>();
                                            ^
ClassTest.java:6: '(' or '[' expected
    new ArrayList<Class<? extends Interface1 & Interface2>>();
                                               ^
ClassTest.java:6: illegal start of expression
    new ArrayList<Class<? extends Interface1 & Interface2>>();
                                                            ^

コンパイラが&の複数の一般的な境界に使用されていることを認識していないことは明らかですClass。の型パラメーターで複数の境界を許可していませんClassか? と の両方を実装ArrayListするClasses が必要な場合はどうすればよいですか?Interface1Interface2

動機:現在取り組んでいるコードには、次のような宣言がたくさんあります。

private static HashMap<String, Class<? extends ApproximativeMode>> approximativeMethod = 
new HashMap<String, Class<? extends ApproximativeMode>>();

特定の計算を行うための「メソッド」を含むクラスに文字列をマップします。個別のハッシュマップはそれぞれ、クラスに異なるワイルドカードを使用します (そのため、正確なメソッドをすべて含むハッシュマップApproximativeModeに置き換えられる場合がありExactModeます)。

すべてのメソッドを調べて、完全な表示名を取得するメソッドを持つ新しいインターフェイスを実装するようにしましたNamedMethod(たとえば、「線形ヒドロキシアデニン メソッド」)。ここで、すべてのハッシュマップを に入れ、ハッシュマップをArrayList調べて完全な名前を表示するイテレータを記述できるようにします。だから私は次のようになるかもしれません:

近似法

フォンアーセン等。

オーウェン等。

正確な方法

サンタルシア等。

LHM

したがって、ArrayListすべてのハッシュマップを保持するという私の宣言は次のとおりです。

private ArrayList<Hashmap<String, Class<? extends NamedMethod>>> namedMethods;

もちろん、実際にはそのタイプのハッシュマップはありませんが、NamedMethodそれぞれのワイルドカードに追加して、ArrayListすべてのハッシュマップを取得できることを望んでいました。明らかにそれは不可能です。

これが明確でない場合は、お知らせください。修正します。

4

1 に答える 1

5

ワイルドカードの境界と型パラメーターの境界:

  • ワイルドカードに複数の境界を設定することはできません。型パラメータに対してのみ使用できます。
  • もう 1 つの違いは、ワイルドカードには上限と下限を設定できますが、型パラメーターには下限がないことです。

したがって、最初の違いによる、複数の境界が必要な場合は、クラスで宣言された型パラメーターを使用する必要があります。つまり、クラス自体をジェネリックにする必要があります。次に、インターフェイスをトップレベル インターフェイスとして個別に宣言する必要があります。

public class ClassTest<T extends Interface1 & Interface2> {
    private ArrayList<Class<T>> testClass = new ArrayList<Class<T>>();    
}

interface Interface1 {}
interface Interface2 {}
于 2013-10-02T10:52:18.523 に答える