2

次の設定を扱っているとします。

A extends B

メインは:

public void doIt() {
    List<A> listOfA = new ArrayList<A>();
    listOfA.add(new A());
    listOfA.add(new A());

    C c = new C();
    // We know that really, listOfA is going to be modified
    //  in some way and will be returned to us, thus, it is 
    //  ok to cast result back to what we know it to be
    List<A> a = (List<A>) c.doSomethingWithListOfA(listOfA);
}

Cメソッドがある場合

public List<? extends B> doSomethingWithListOfA(List<? extends B> 
                                     listOfObjectsThatExtendB) {
    return someFormofListA;
}

(List) のキャスト c.doSomethingWithListOfA(listOfA); - Type safety: Unchecked cast from List<capture#1-of ? extends B> to List<A>警告が返ってきます。

他のクラスも B を拡張する可能性があるため、実際には A のリストなのか、B を拡張する X なのかコンパイラが不明になる可能性があるのではないでしょうか?

警告を抑制する以外に、どうすればこれを確認できますか? (未チェックのキャスト)

4

1 に答える 1

3

そのメソッドは B のサブタイプである任意のタイプのリストを返す可能性があるため、タイプ セーフではありません。

次のように書いてみてはどうでしょうか。

public <T extends B> List<T> doSomethingWithListOfA(List<T> listOfObjectsThatExtendB) {
  return listOfObjectsThatExtendB;
}

キャストは不要になりました。

List<A> a = c.doSomethingWithListOfA(listOfA);
于 2012-08-02T02:02:53.083 に答える