数组与泛型集合相比,有两个重要的不同点。
首先,数组是协变的,相反,泛型则是不可变的。所谓的协变是指:如果Sub类是Super类的子类型,那么数组类型Sub[] 就是Super[]的子类型,也就是
说可以将Sub[]数组实例赋给Super[]数组类型变量。相反泛型是不可变的,那么List<Sub>与List<Super>则不存在子类型与超类型的关系。也就是说
不能将ArrayList<Sub>实例赋给ArrayList<Super>类型的变量。
其次,数组是具体化的。因此数组会在运行时才知道并检查它们的元素类型约束。如果企图将String类型的对象保存在Long数组中,编译时并不会报错。
但是在运行会抛出ArrayStoreException异常。相比之下,泛型则是通过擦除来实现的。因此泛型只是在编译的时候强化它们的类型信息,并在运行时
丢弃它们的元素类型信息。擦除就是使泛型可以与没有使用泛型的代码随意进行互用。
由于上面的根本区别,因此数组和泛型集合不能很好的混合使用。如:new List<E>[] ,new List<String>[],new E[]都是不合法的。