Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java多态性和列表_Java_List_Polymorphism_Extends - Fatal编程技术网

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”ListA
List
无法处理
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;
  //...
}