Java 实例化基类的扩展时出现问题
我有一个空的抽象基类:Java 实例化基类的扩展时出现问题,java,generics,inheritance,collections,Java,Generics,Inheritance,Collections,我有一个空的抽象基类: 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
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?
}
公共类it{
名单;
列表=新的ArrayList;
//获取上面的错误。
//我以为我能做到?
}
我应该试试什么?我试图得到一个基类的列表。然后根据具体情况,创建两个扩展类的列表。您可以这样创建列表:
list = new ArrayList<base>();
Java教程中的列表
和列表。列表
和列表
和不同类型。他们没有继承关系
但你可以这样声明:
List<? extends base> list;
list = new ArrayList<a>
List<b> getBList(){
if (baseList instanceof b ){
return (List<b>) baseList<base>;
}
else return null;
}
List此代码不起作用的原因是,虽然所有a
实例都是base
实例,但并非所有base
实例都是a
实例(例如b
)
具体而言,List
意味着您可以将a
和b
实例添加到列表中:
List<base> bases = new ArrayList<base>();
bases.add(new a());
bases.add(new b());
添加b
就是将其添加到只应接受a
实例的内容中。因此,Java通过禁止编译该语句来防止这种情况的发生。如果我想这样做怎么办:
List<? extends base> list;
list = new ArrayList<a>
List<b> getBList(){
if (baseList instanceof b ){
return (List<b>) baseList<base>;
}
else return null;
}
List getBList(){
if(b的基本列表实例){
返回(列表)基本列表;
}
否则返回null;
}
请遵守Java命名约定:类以大写字母开头。下面的答案是这样的,只需将类名与大写字母放在一起即可。公共阶级基础。公共A类扩展基础。。。这是一个很小的问题,但是坚持传统是一个很大的帮助。这很好地回答了这个问题。ArrayList(对我越来越有用)和泛型值得一读。
List<b> getBList(){
if (baseList instanceof b ){
return (List<b>) baseList<base>;
}
else return null;
}