0

我有一个空的抽象基类:

public abstract class base{ }

和两个扩展它的类:

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?
}

我应该尝试什么?我试图列出基类。然后根据情况,可以创建两个扩展类的列表。

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>在任何类层次结构中都不相同或相关。仅仅因为两个集合中元素的类型相关并不能使集合实例相关。

您可以将 的衍生类添加base到同一List<base>实例:

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

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

请参阅Java 教程中的泛型和子类型。

于 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 回答