Java ArrayList泛型:子类
为什么即使语句2无效,语句1仍然有效。我可以理解报表2无效的原因,但为什么相同的原则不适用于Statament 1Java ArrayList泛型:子类,java,generics,arraylist,Java,Generics,Arraylist,为什么即使语句2无效,语句1仍然有效。我可以理解报表2无效的原因,但为什么相同的原则不适用于Statament 1 import java.util.*; public class CollectionTest { public static void main(String[] args) { ArrayList<ObjectB> test = new ArrayList<ObjectA>(); //statement 1
import java.util.*;
public class CollectionTest
{
public static void main(String[] args)
{
ArrayList<ObjectB> test = new ArrayList<ObjectA>(); //statement 1
ObjectB B = new ObjectA("aaa");//statement 2
}
}
class ObjectA
{
String a;
ObjectA(String str) {
a = str;
}
}
class ObjectB extends ObjectA
{
String b;
ObjectB(String str) {
super(str);
b = str;
}
}
import java.util.*;
公共类集合测试
{
公共静态void main(字符串[]args)
{
ArrayList test=新建ArrayList();//语句1
ObjectB=newObjectA(“aaa”);//语句2
}
}
类对象A
{
字符串a;
ObjectA(字符串str){
a=str;
}
}
类ObjectB扩展了ObjectA
{
b串;
ObjectB(字符串str){
超级(str);
b=str;
}
}
这是因为泛型在Java中没有具体化,它们在编译时被删除。语句1无效,但在更宽松的情况下会转换为ArrayList
。语句2有一个强类型,其关系为“所有ObjectB
s都是ObjectA
s,但并非所有ObjectA
s都是ObjectB
s”。这类似于“并非所有动物都是狗,但所有狗都是动物。”<。如果您尝试运行此命令,将出现编译器错误。不能将子类引用指定给超类对象。只能将超类引用分配给子类对象,如ObjectA a=new ObjectB()
;此外,对于泛型,规则更为严格。您在左侧传递的类型应与右侧的类型匹配,如下所示
ArrayList<ObjectB> test1 = new ArrayList<ObjectB>(); // valid
?扩展ObjectA
任何东西都意味着您可以拥有任何对象,该对象可以扩展ObjectA
(如果是类)或在RHS上实现ObjectA
(如果是接口)。您正在比较两个(无效)不同的对象。如果你想做这个类比,你应该这样定义你的数组列表:arraylisttest=newarraylist()代码>
ArrayList<ObjectA> test2 = new ArrayList<ObjectA>(); // valid
ArrayList<ObjectA> test = new ArrayList<ObjectB>(); // error
ArrayList<? extends ObjectA> test = new ArrayList<ObjectB>(); // valid
ArrayList<? extends ObjectA> test = new ArrayList<ObjectA>(); // valid