2017-02-08 5 views
1

Javaでペアのリストを比較する状況があります。私はこれをApacheのPairインターフェイスから使用しています。2つの汎用パラメータを持つクラスのJavaジェネリック型チェックでは、同じタイプのクラスのみを保持する必要があります。

Aペアの左右の値がComparableを実装するタイプのものとすることができる

ので、以下のように、私はリストを宣言します。

List<Pair<Comparable, Comparable>> listOfPairs; 

左と右の値は常に、例えば、同じタイプである必要がありますPair<String, String>またはPair<Integer, Integer>であり、両方の種類のペアを同じリストに追加できます。

これは動作します:

Pair<Comparable, Comparable> p1 = new ImmutablePair<>("a", "b"); 
    Pair<Comparable, Comparable> p2 = new ImmutablePair<>(2, 3); 

    listOfPairs.add(p1); 
    listOfPairs.add(p2); 

これも動作します:

Pair<Comparable, Comparable> p3 = new ImmutablePair<>("a", 2); 
    listOfPairs.add(p3); 

は、それが追加されるとペアの種類は、同じタイプであることを保証するために、型チェックを持つことが可能ですリストに、例えばコンパイル時に失敗する?

+0

いいえ、ジェネリックのみではありません。リストへのアクセスをカプセル化し、メソッドの汎用引数を制御する必要があります。 – Kayaman

答えて

0

はい、変数がローカル変数の場合は、宣言されたメソッドに型パラメーターを追加できます。

フィールドがフィールドの場合は、クラスに型パラメータを追加できます。

public class MyClass<T extends Comparable> { 
    ... 
    private List<Pair<T, T>> listOfPairs; 
    ... 

別の方法は、これらの訴訟のどちらもあなたの状況ならば、必要に応じてPairの代わりにそれを使用し、その後、メンバーを持たないこのような独自のPair汎用クラス何かを定義することです。このクラスにスーパークラスコンストラクタに委譲するコンストラクタを書く必要があります。

public class SelfPair<T> extends Pair<T,T> { 
    public SelfPair(T first, T second) { 
     super(first, second); 
    } 
} 
0

はい、あなたはImmutablePairまたはPairクラスを拡張する独自のクラスを実装できます。

例:

public class MyPair<T> extends Pair<Comparable<T>, Comparable<T>> { 

public MyPair(T key, T value) { 

} 

} 

あなたは、このようなクラスのインスタンスを作成すると、一般的なT型は、常に両方の引数に対して同じになります。

関連する問題