Java 具有列表和arrayList的多态性
我有下一个Java 具有列表和arrayList的多态性,java,generics,polymorphism,Java,Generics,Polymorphism,我有下一个 public interface MyInterface{} public class ClassA implements MyInterface(){} public class ClassB extends ClassA{} 理论上,对象B的有效引用类型如下: MyInterface myIn = new ClassB(); ClassA o1 = new ClassB(); ClassB o2 = new ClassB(); Object o3 = new ClassB()
public interface MyInterface{}
public class ClassA implements MyInterface(){}
public class ClassB extends ClassA{}
理论上,对象B的有效引用类型如下:
MyInterface myIn = new ClassB();
ClassA o1 = new ClassB();
ClassB o2 = new ClassB();
Object o3 = new ClassB();
如果我想做这样的事。。。
List o1=new ArrayList()代码>
我得到一个编译错误。
有什么想法吗?一个ArrayList
只能包含ClassB
的实例或ClassB
的子类
另一方面,列表
还可以包含ClassA
的实例(不一定是ClassB
的实例)和实现MyInterface
的任何其他实例
因此,您不能将数组列表
分配给列表
变量
如果希望o1
列表包含任何MyInterface
实例,则应为其分配一个ArrayList
如果希望o1
仅包含ClassB
的实例,请将其类型更改为List
泛型在编译时工作,因此ArrayList()
中的泛型
非常不必要。您将看到更重要的generic
是List
,因为这定义了编译时的generic
列表。作为一个侧节点,这也是为什么JDK1.7在初始化列表时引入空菱形操作符的原因。例如,可以忽略右侧的泛型简单。类B的所有对象都是类a的对象,因此也是实现接口的对象。事实上,如果我尝试这样做,我的接口o1=newclassb();它编译ok@silviaDominguez但并非所有的ClassA对象都必须是ClassB的对象。@silviaDominguezClassB
实现了MyInterface
,因此您可以进行该赋值。但是,ArrayList
不实现List
——它实现List
。并且List
不是List
的子接口,不能分配给这种类型的变量。@因此,尽管ArrayList实现了List,但我在这里不能使用多态性,对吗?