2017-01-26 13 views
2

クラスで指定された型の要素を含むArrayListを使用したいと思います。特定のクラスを拡張する汎用タイプTを再利用

public class Foo<T extends Comparable<T>> extends AbstractFoo { 

    private ArrayList<T> list = new ArrayList<T>(); 

    @Override 
    public void add(Comparable e) { 
     list.add(e); // The method add(T) in the type ArrayList<T> is not applicable for the arguments (Comparable) 
    } 
} 

のはなぜlistからeを追加することはできませんか? TがComparableを確実に拡張するので、私はelistに加えることができると思います。

答えて

2

クラスTeacherとクラスStudentの両方がComparableを実装しているとします。今度はFoo<Teacher>を作成すると、このfooオブジェクトに教師のリストArrayList<Teacher>が含まれます。あなたのコードがコンパイルされたら、教師リストに学生を追加することができます(それは匹敵します)。これはもちろん許可されていません。

あなたが実際に必要になることがあります。

@Override 
public void add(T e) { 
    list.add(e); 
} 
1

すべてT sがComparableですが、すべてのComparablesはあなたがTのリストにComparableを追加することはできませんTのあるではないので。

`Comparable`生タイプですので、あなたはこの作品だけArrayList<Comparable<T>>

しかし
public class Foo<T extends Comparable<T>> extends AbstractFoo { 

    private ArrayList<Comparable<T>> list = new ArrayList<>(); 

    @Override 
    public void add(Comparable e) { 
     list.add(e); 
    } 
} 
+0

を持っていることによってそれを行うことができます。 addメソッドの種類は 'List >'をこの場合は任意のcomparablesで汚染します。 – Calculator

+0

真。メソッドのパラメータを「Comparable e」に変更する方がよいでしょう。しかし、私はこの質問の範囲外かもしれないと思う –

関連する問題