0

空の抽象基本クラスがあります。

public abstract class base{ }

それを拡張する2つのクラス:

public class a extends base{}
public class b extends base{}

そして別のクラスで私はそれを参照しています:

public class it {

    List<base> list;
    list = new ArrayList<a>; 

    //getting an error above.
    // I thought I could do this?
}

何を試すべきですか?基本クラスのリストを取得しようとしていました。その後、状況に応じて、2 つの拡張クラスのリストを作成できます。

4

5 に答える 5

4

次のようにリストを作成できます。

list = new ArrayList<base>(); 

このリストには、タイプ a および b のアイテムを含めることができます。たとえば、次のようなものは問題ありません。

A a = new A().
list.add(a);
于 2012-09-20T14:42:06.563 に答える
4

List<base>List<a>どのクラス階層でも同じタイプまたは関連性はありません。2 つのコレクションの要素の型が関連しているからといって、コレクション インスタンスが関連しているとは限りません。

の派生クラスをbase同じList<base>インスタンスに追加できます。

List<base> list = new ArrayList<base>();

list.add(new a());
list.add(new b());

Java チュートリアルのGenerics and Subtypingを参照してください。

于 2012-09-20T14:42:28.507 に答える
2

List<Base>List<A>と 異なるタイプ。継承関係はありませんでした。

しかし、次のように宣言できます。

List<? extends base> list;

list = new ArrayList<a>

《Effective Java》のジェネリック型を参照してください。

于 2012-09-20T14:44:47.380 に答える
1

このコードが機能しない理由は、すべてのaインスタンスがbaseインスタンスである一方で、すべてのbaseインスタンスがaインスタンス ( などb) ではないためです。

具体的には、とインスタンスをリストにList<base>追加できることを意味します。ab

List<base> bases = new ArrayList<base>();
bases.add(new a());
bases.add(new b());

basesのすべてが のインスタンスであるため、正しくコンパイルされますbase

一方、Java でコードの使用が許可されている場合:

List<base> bases = new ArrayList<a>();
bases.add(new a());
bases.add(new b());

を追加すると、インスタンスbのみを受け入れる必要があるものに追加されます。aしたがって、Java は、そのステートメントのコンパイルを許可しないことで、それを防ぎます。

于 2012-09-20T14:49:13.050 に答える
0

このようなことをしたい場合はどうなりますか?

List<b> getBList(){

  if (baseList instanceof b ){
      return (List<b>) baseList<base>;
  }
  else return null;

}
于 2012-09-20T15:48:54.260 に答える