2011-08-10 12 views
3

などのインターフェースを提供する場合、私はコンパイルエラーのArrayList型

interface ListItem { 
    public String toString(); 
    public String getUUID(); 
} 

として定義インターフェースとそのインターフェースを実装するクラス(BrowseItem)を有します。私がしようとすると:

ArrayList<ListItem> = (method returning ArrayList of type BrowseItem) 

は、私は互換性のないタイプのエラーを取得する( found ArrayList<BrowseItem>, require ...<ListItem>

私はこの間違ったに近づいていますか?

答えて

2

ArrayList<listItem>は、彼らは厳密には共変ではありません?

10

のJavaジェネリック医薬品の安全

あなたが作ることができ、使用を入力しているArrayList<browseItem>

と同じではありません。

見る(among many other questions on SO):


ソリューション:

  • 問題のあるメソッドの戻り値の型を変更します。つまり、

    List<listItem> = (method returning List of type browseItem) 
    // to 
    List<listItem> = (method returning List of type listItem) 
    
  • 使用ワイルドカード共分散を変更された(私はこれはと呼ばれるものだとを考える):

    List<? extends listItem> = (method returning List of type browseItem) 
    

    you cannot add items to the list if you take this routeことに注意してください。


N.B.リストタイプをList<T>と宣言し、ArrayList<T>ではなく一般的には良い習慣です。上記の擬似コードはこれを反映しています。

3

あなたの例のdoesntの仕事をしていますが、これは動作するはず

ArrayList<? extends ListItem> list = (method returning ArrayList of type browseItem) 

使用することができます。