1

次のクラスがあります。

public class Base {
   public int someMethod(){...}
}

public class Derrived extends Base {
   @Override
   public int someMethod(){...}
}

また、私はList<Base>

List<Base> method() {
   return fetch();
}

メソッドfetch()は戻りますList<? extends Base>が、実際には Derived クラスのインスタンスのリストを保持しています

List<? extends Base> fetch() {}

ただし、メソッドを定義するコードmethod()はコンパイルされません。へのキャストが必要List<Base>です。そのコレクションのインスタンスを常に Base クラスのインスタンスとして扱うことができるのに、なぜキャストする必要があるのでしょうか?

4

2 に答える 2

6

バナナの束がフルーツボウルではないのと同じように、AList<? extends Base>は と同じではありません。List<Base>

検討:

List<Derived> x = new ArrayList<Derived>();

// This is valid...
List<? extends Base> y = x;

// This is what you *want* to be valid
List<Base> z = y;

z.add(new Base());

// This looks fine at compile-time... but what would you expect it to do?
Derived d = x.get(0);

a の既存のすべての要素を-List<Derived>のインスタンスとして扱うことは 1 つのことですが、a に a を追加することはできますが、aに a を追加Baseすることはできません。すべてが 存在するわけではありません。BaseList<BaseList<Derived>List<Derived>List<Base>

于 2012-05-28T15:10:15.557 に答える
1

Base の別のサブクラスのオブジェクトを Collection に挿入しようとしないという保証がないため、これを行うことはできません。

その場合はどうなりますか?

問題ないように見えますが、基本的には、同じコレクション内で 2 つの異なるタイプのオブジェクトを使用しようとしています。これは、ご存じのとおり、許可されていません。

于 2012-05-28T15:11:26.430 に答える