• List<Object> list1 = new ArrayList<Object>();正确
  • List<Object> list1 = new ArrayList<String>();错误
  • 如果要实现上面的形式,后者泛型约束是前者泛型约束的子类,则可以使用List<?> list3 = new new ArrayList<String>();,等价于List<? extends Object> list3 = new new ArrayList<String>();
  • 还可以写List<? extends String> list3 = new new ArrayList<String>();,此时不用考虑基类是否可以被继承,只要形式上满足就可以

1.数组

Java中数组是一种对象,同时数组的定义也可以采用多态的形式,但实际存储的元素取决于右边的对象,即只能存储右边对象及其子类。例如父类A有两个子类A1和A2,那么A[] a = new A1[5],此时数组a中只能存放A1以及A1的子类,但是语句a[0] = new A2();并不会产生编译错误,只是会产生运行时异常”ArrayStoreException”

对于集合,如果定义一个方法fun(Collection a){}那么Collection a1;并不能作为fun()的参数