Reason of Type mismatch Error : convert ArrayList<SubClass1> to List<SuperClass>?
Reason of Type mismatch Error : convert ArrayList<SubClass1> to List<SuperClass>?
Class B extends class A.We 可以用这个语句:
A a = new B();
但是为什么我们不能使用这个代码:
List<A> listOfA = new ArrayList<B>();
当然,我们可以使用generics to avoid that error。但我的问题是关于出现该错误的原因。
如果你能做到这一点,你就可以写
listOfA.add(new A());
将 A
类型的对象插入 ArrayList<B>
。
试试这个
List<? extends A> listOfA = new ArrayList<B>();
这里的规则很简单。List
是 ArrayList
的超类型(或接口)。因此您可以安全地将 ArrayList
引用分配给 List
variable.But 这是针对非泛型类型的。List
& ArrayList
就像模板,如果你以泛型方式创建它,变量声明的类型必须与你传递给实际对象的类型相匹配type.It 是泛型类型安全,所以你知道(从编译器的角度)你可以对该列表中的每个对象进行类型安全操作。
对我来说,原因是 java 开发人员不想重复他们在数组中犯的错误。例如,
Object x[] = new String[3];
x[0] = new Integer(0);
此代码给出运行时异常java.lang.ArrayStoreException
Class B extends class A.We 可以用这个语句:
A a = new B();
但是为什么我们不能使用这个代码:
List<A> listOfA = new ArrayList<B>();
当然,我们可以使用generics to avoid that error。但我的问题是关于出现该错误的原因。
如果你能做到这一点,你就可以写
listOfA.add(new A());
将 A
类型的对象插入 ArrayList<B>
。
试试这个
List<? extends A> listOfA = new ArrayList<B>();
这里的规则很简单。List
是 ArrayList
的超类型(或接口)。因此您可以安全地将 ArrayList
引用分配给 List
variable.But 这是针对非泛型类型的。List
& ArrayList
就像模板,如果你以泛型方式创建它,变量声明的类型必须与你传递给实际对象的类型相匹配type.It 是泛型类型安全,所以你知道(从编译器的角度)你可以对该列表中的每个对象进行类型安全操作。
对我来说,原因是 java 开发人员不想重复他们在数组中犯的错误。例如,
Object x[] = new String[3];
x[0] = new Integer(0);
此代码给出运行时异常java.lang.ArrayStoreException