2012-03-09 7 views
1

ジェネリックにいくつか問題があります。ジェネリック型の引数を持つメソッドを呼び出すときの問題

私がLinkedListのをラップするクラスを持っている:

public class IdnList<T extends Numerable> extends IdnElement implements List<T> { 

    private LinkedList<T> linkedList; 

    @Override 
    public boolean add(T e){ 
     return linkedList.add(e); 
    } 

    //stuff 
} 

このクラスextendsのジェネリック型TNumerableインターフェースがありますのでご注意ください。

[OK]を、今、別のクラスの内部で、私は次のようにこのメソッドを呼び出したい:The method add(capture#1-of ?) in the type IdnList<capture#1-of ?> is not applicable for the arguments (Numerable)を、そしてそれが動作することはできませんなぜ私は本当に理解することはできません。

if(childToAdd instanceof Numerable) 
((IdnList<?>)this).add((Numerable)childToAdd); 

が、日食は述べています。なぜ私のリストにNumerableオブジェクトを追加できないのですか? 私は何が欠けていますか?

編集: これは古典的です。あなたは尋ねると、あなたは手がかりを見つける。回避策のようです:

((IdnList<Numerable>)this).add((Numerable)childToAdd); 

しかし、私はそれがどれほどエレガントかわかりません。それ以上のコメントは本当にありがたいです。

+1

ation)? – assylias

+0

おっと、申し訳ありません。それは 'IdnElement'です。 – MaVVamaldo

答えて

2

ABの両方がNumerableになるとします。次に、IdnListの3つの有効なタイプ:IdnList<A>,IdnList<B>およびIdnList<Numerable>があります。

IdnList<A>Numerableを追加できないことに同意していただければ幸いです。

ここで、このコード行で、コンパイラは型を正しく一致させたかどうかをどのように知っていますか?

(IdnList<?>)this).add((Numerable)childToAdd); 

それは知っているすべてはchildToAddNumerableであるということである、とthisことIdnListのいくつかの種類があります。どのような種類なのかわからないので、型の安全性を保証できません。ジェネリック型チェックは、実行時ではなくコンパイル時に完全に行われることに注意してください。

回避策でコードをコンパイルする方法がわかりましたが、そのリスクについてはわかりません。ジェネリック型のパラメータは実行時に消去されるので、ここではすべての型チェックをバイパスしているだけです。

+0

あなたは何を言っているのですか。しかし、私は私のIdnListのタイプを宣言しないことを望む(私は反射で働いていると私は一般的に滞在したいと思う)私は私の問題を解決するためのエレガントな方法がないようだ。 – MaVVamaldo

1

問題は、他のクラスのIdnListのインスタンスへの参照にあります。 コード例でそれを見ることはできませんが、適切な型が関連付けられていないように見えます。特にワイルドカードにキャストされている場合はそうではありません。

IdnListはインスタンスごとにタイプ(T)が設定されている必要があるため、コンパイラが何をしようとしているかを知る方法はありません。(AnotherTypeとYetAnotherTypeがNumerableのサブクラスであることを考えると)

IdnList<Numerable> list = new IdnList<Numerable>(); 
    list.add(new Numerable()); 
    list.add(new AnotherType()); 
    list.add(new YetAnotherType()); 

:あなたのIdnListをご参照がそれに関連付けられた適切な型を持っている場合

することは、それはそうのように、Tの任意のサブクラスを受け付けます

あなたのインスタンスへの参照に設定された任意の型を持っていないので、私はあなたが実際にやろうとしているが、このであることを推測しています: `this`(何クラスDECLARが何であるかを

public class IdnList extends IdnElement implements List<Numerable> { 

    private LinkedList<Numerable> linkedList; 

    @Override 
    public boolean add(Numerable e) { 
     return linkedList.add(e); 
    } 
} 
関連する問題