关于java:ArrayList和Polymorphism

ArrayList and Polymorphism

本问题已经有最佳答案,请猛点这里访问。

如果有人能在这里指出问题和可能的解释,这将是非常有帮助的。

1
2
3
4
5
6
7
8
9
10
11
class Parent{}    
public class ChildClass extends Parent{
  /*Main class*/    
  public static void main(String[] args) {  

      ArrayList<ChildClass> a3 = new ArrayList<ChildClass>();  
      foo(a3);      
    }
  /*another function*/
  static void foo(ArrayList<Parent> obj) {      
}

这将引发以下编译错误。

1
The method foo(ArrayList<Parent>) in the type ChildClass is not applicable for the arguments (ArrayList<ChildClass>)

多态性规则应该允许我这样做。正确的?毕竟,儿童班是家长。有什么问题吗?


ChildClass是一个Parent,但ArrayList不是一个ArrayList。如果您考虑此代码,应该清楚为什么:

1
2
3
4
5
6
7
8
9
ArrayList<ChildClass> a3 = new ArrayList<>();
foo(a3);
ChildClass c = a3.get(0);

...

static void foo(ArrayList<Parent> obj) {
   obj.add(new Parent());
}

如果上述代码编译时没有出错,那么它将是类型不安全的,并且在运行时使用ClassCastException会失败。

因此,对于关系"ArrayList是一个ArrayList实际上是有意义的,这两个事实必须同时真实:

  • ChildClass是一个Parent
  • Parent是一个ChildClass
  • 一般来说,只有当ChildClassParent在不同名称下的类型相同时,这才是正确的。因此,我们得到了真正的规则Java应用,它被称为类型不变性:它既不持有EDCOX1×2"是EDCOX1×3",也不知道EDCOX1×3"是EDCOX1×2"。