【问题标题】:Problems instantiating an extension of a base class实例化基类扩展的问题
【发布时间】:2012-09-20 14:36:31
【问题描述】:

我有一个空的抽象基类:

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

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

【问题讨论】:

  • 请尊重 Java 命名约定:类以大写字母开头。
  • 下面的答案有它,只是一个带大写字母的类名。公共类基础。 public class A extends Base... 一个小点,但对遵守约定很有帮助。

标签: java generics inheritance collections


【解决方案1】:

您可以这样创建列表:

list = new ArrayList<base>(); 

这个列表可以包含a和b类型的项目。例如下面的就可以了

A a = new A().
list.add(a);

【讨论】:

【解决方案2】:

List&lt;base&gt;List&lt;a&gt; 在任何类层次结构中都不是同一类型或相关的。仅仅因为两个集合中元素的类型相关并不能使集合实例相关。

您可以将base 的衍生类添加到同一个List&lt;base&gt; 实例中:

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

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

请参阅 Java 教程中的 Generics and Subtyping

【讨论】:

    【解决方案3】:

    List&lt;Base&gt;List&lt;A&gt; 和不同的类型。他们没有继承关系。

    但你可以这样声明:

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

    参见《Effective Java》泛型类型。

    【讨论】:

      【解决方案4】:

      此代码不起作用的原因是,虽然所有a 实例都是base 实例,但并非所有base 实例都是a 实例(例如b)。

      具体而言,List&lt;base&gt; 表示您可以将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 通过禁止编译该语句来防止这种情况发生。

      【讨论】:

        【解决方案5】:

        如果我想做这样的事情怎么办:

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

        【讨论】:

          猜你喜欢
          • 2013-07-04
          • 1970-01-01
          • 2021-02-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-24
          相关资源
          最近更新 更多