Java多态性和列表
假设我有以下的班级结构Java多态性和列表,java,list,polymorphism,extends,Java,List,Polymorphism,Extends,假设我有以下的班级结构 public abstract class MyClass{} public class MyClassA extends MyClass{} public class MyClassB extends MyClass{} 我如何创建一个包含MyClassA和MyClassB元素的MyClass元素列表而没有异议 e、 g List myList=newlinkedlist(); 多态性是对象具有多种形式的能力。在OOP中,当父类引用用于引用子类对象时,多态性最常用
public abstract class MyClass{}
public class MyClassA extends MyClass{}
public class MyClassB extends MyClass{}
我如何创建一个包含MyClassA和MyClassB元素的MyClass元素列表而没有异议
e、 g
List myList=newlinkedlist();
多态性是对象具有多种形式的能力。在OOP中,当父类引用用于引用子类对象时,多态性最常用。父类引用可以保存其任何子类的对象。因此,父对象的集合可以容纳子类对象。例如:
List<MyClass> myClassList = new ArrayList<MyClass>();
List myClassList=new ArrayList();
使用List
接口实现具体/抽象类。像这样的
List<MyClass> list = new ArrayList<MyClass>();
List List=new ArrayList();
您可以使用通配符,如列表根据您的需要,您有几个选项。您可以使用普通列表类型对象。这允许您添加类型为MyClassA
和MyClassB
的对象。不能将列表类型对象设置为类型为List
的变量。这是由于一个称为方差的概念造成的。大多数支持泛型的编程语言中都存在三种类型的差异(参数化多胞主义)
不变性
不变性不允许在任何方向上偏离类型。默认情况下,Java中的泛型就是这种情况,这就是为什么不能将List
分配给List
变量的原因。
想象一下以下场景:
List<MyClassA> listA = new List<MyClassA>();
List<MyClass> list = (List<MyClass>) listA; // Produces a compilation error...
list.add(new MyClassB()); // ... because this would be a big no-no
我希望这有助于澄清一些问题。List List=…//选择您最喜欢的
。情况并非如此,我得到一个错误“Required List but found List”ListAList
无法处理MyClassB
或MyClass
对象,因此您所做的是错误的。如果您给我们看,我们可以进一步解释。请阅读以下内容:
List<? extends MyClass> myList = null;
ArrayList<MyClassA> actualListA = new ArrayList<MyClassA>();
myList = actualListA;
MyClassA myClassA = new MyClassA();
actualListA.add(myClassA);
myList.add(new MyClassA()); //Nope, you can't do this because myList could be assigned to an array of MyClassB items like the following.
//Reassign
ArrayList<MyClassB> actualListB = new ArrayList<MyClassB>();
myList = actualListB;
MyClassB myClassB = new MyClassB();
actualListB.add(myClassB);
//Get item
MyClass item = myList.get(0);// This will give you the myClassB object.
List<MyClassA> listA = new List<MyClassA>();
List<MyClass> list = (List<MyClass>) listA; // Produces a compilation error...
list.add(new MyClassB()); // ... because this would be a big no-no
List<? extends MyClass> list = new LinkedList<MyClassA>();
list.add(new MyClassA());
List<? super MyClass> list = new LinkedList<MyClass>();
list.add(new ChildA());
Object o = list.get(0);
if (o instanceof MyClassA) {
MyClassA mca = (MyClassA) o;
//...
}