Javaでジェネリックを使用してリストをキャストするにはどうすればよいですか? 質問する

Javaでジェネリックを使用してリストをキャストするにはどうすればよいですか? 質問する

次のスニペットを検討してください。

public interface MyInterface {

    public int getId();
}

public class MyPojo implements MyInterface {

    private int id;

    public MyPojo(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

}

public ArrayList<MyInterface> getMyInterfaces() {

    ArrayList<MyPojo> myPojos = new ArrayList<MyPojo>(0);
    myPojos.add(new MyPojo(0));
    myPojos.add(new MyPojo(1));

    return (ArrayList<MyInterface>) myPojos;
}

return文はコンパイルされないキャストを行います。myPojosリストをより汎用的なリストに変換するにはどうすればよいでしょうか。リストの各項目を確認する必要がなく?

ありがとう

ベストアンサー1

ワイルドカードを使用するようにメソッドを変更します。

public ArrayList<? extends MyInterface> getMyInterfaces() {    
    ArrayList<MyPojo> myPojos = new ArrayList<MyPojo>(0);
    myPojos.add(new MyPojo(0));
    myPojos.add(new MyPojo(1));

    return myPojos;
}

これにより、発信者が追加しようとするのを防ぐことができます他のリストへのインターフェースの実装。あるいは、次のように書くこともできます。

public ArrayList<MyInterface> getMyInterfaces() {
    // Note the change here
    ArrayList<MyInterface> myPojos = new ArrayList<MyInterface>(0);
    myPojos.add(new MyPojo(0));
    myPojos.add(new MyPojo(1));

    return myPojos;
}

コメントで議論されているように:

  • ワイルドカードコレクションを返すのは呼び出し側にとって厄介な場合がある
  • 通常、戻り値の型には具体的な型ではなくインターフェースを使用する方が適切です。したがって、推奨されるシグネチャはおそらく次のいずれかになります。

    public List<MyInterface> getMyInterfaces()
    public Collection<MyInterface> getMyInterfaces()
    public Iterable<MyInterface> getMyInterfaces()
    

おすすめ記事