2011-08-17 10 views
2

なぜこれが動作しません...実装とコレクション

public ArrayList<Edge> getEdges() { 

return A; 

//A is an Arraylist of type 'Action'. Action implements Edge. 

} 

インターフェース・エッジが含まれています:公共のArrayList getEdgesを();

でもこれがあります。

public Edge getEdges() { 

return B; 

//B is an 'Action'. Action implements Edge. 

} 

インターフェイスエッジには次のものが含まれます。public Edge getEdges(); EdgeActionのサブタイプである一方で、ArrayList<Action>ArrayList<Edge>のサブタイプではないので

は、 チェット

答えて

7

をありがとうございました。

代わりにArrayList<? extends Edge>を使用してください。

あなたはthis tutorial's 4. Wildcard sectionを見ることができますが、本当に役に立ちますので、読んでみることをおすすめします。

0

それを動作させるために、あなたはこのように書き換えることができ、それから延びているものではありません、ジェネリック型は常に同じでなければならないので:ArrayList<E>が上covariantないためです

public ArrayList<? extends Edge> getEdges() { 

return A; 

//A is an Arraylist of type 'Action'. Action implements Edge. 

} 
2

タイプEと入力します。つまり、がBaseを継承しているため、ArrayList<Derived>のインスタンスをArrayList<Base>に置き換えることはできません。

このケースを検討してください:StringObjectを継承します。 しかし、これはあなたがして、次のコードは可能でしょうArrayList<Object>としてArrayList<String>を使用できるものであれば:あなたはArrayList<String>Integerを追加することはできませんので

ArrayList<Object> list = new ArrayList<String>(); 
list.add(new Integer(5)); // Integer inherits from Object 

以上、動作することはできません。あなたは、これが起こることができる可能性がある場合:Ziyao has indicatedとして

ArrayList<String> stringList = (ArrayList<String>)list; 
String string = stringList.get(0); // Not a string! 

を、これを実装する正しい方法は? extends Edge構文を使用することです。

2

バナナは、果実です。 のバナナのリストは果物のリストではありません。

誰かがバナナのリストを作成し、果物のリストへの参照を渡して、それにリンゴを挿入することができます。バナナのリストの所有者は正当に驚かれるでしょう。

+1

[私はバナナです](http://www.youtube.com/watch?v=LH5ay10RTGY&ob=av3e) – mre

関連する問題