这个显然是多态的原理,你Student继承了Person,其实泛型有这种写法, 上限(上边界):ArrayList<? extends Number> al = new ArrayList<Integer>(); 正确这句话的意思是说,是Number的子类,包含Number自己, 也就是说,你再不济也得是Number 最多你也就到Number了,和Number的儿子们。ArrayList<? extends Number> al = new ArrayList<String>(); 错误 原因:Number的儿子们中包括Number自己,都没有你String这吗个东西。 下限(下边界):ArrayList<? super Integer> al = new ArrayList<Number>(); 正确 这句话是说,是Integer的父类,包含Integer自己,也就是说,最低也得是Integer, 或者是他的 爸爸,爷爷们。ArrayList<? super Integer> al = new ArrayList<Byte>(); 错误 原因:Byte既不是Integer的爸爸,也不是Integer的爷爷,更不是Integer自己,他是Inetger的兄弟, 所以错误。 Lz要理解多态 男人继承人 你给List规定里面必须是人 那么 男人自然也可以装到集合里
http://mysun.iteye.com/blog/851925
这样吧API中的addAll(Collection<? extends E> c)方法定义的时候,定义成addAll(Collection<E> c) 两个效果是一样的麽,
addAll和add方法无本质区别但是你要是按照下面的写法就无法 add了
ArrayList<? extends Person> al = new ArrayList<Student>();
al.add(new Student("abc"));
al.add(new Person("abc"));
因为编译器不知道你add的是具体父类还是子类
/**
* 使用泛型为了解决类型匹配的问题
* 必须是People 类型才能添加到List中,否则直接编译不通过
*/
class MyList extends ArrayList<People>
{
@override
public boolean add(People p)
{
return add(p);
}
}那么将Student 作为参数调用add(People P) 方法是否成功呢?根据多态原理,当然成功了。故,ArrayList<People> 可以添加 People 类的子类的对象
那addAll(Collection<? extends E> c)方法中写<? extends E>和写<E>岂不是没有分别了 ,如果<E>可以传入E和E的子类类型
上限(上边界):ArrayList<? extends Number> al = new ArrayList<Integer>(); 正确这句话的意思是说,是Number的子类,包含Number自己, 也就是说,你再不济也得是Number
最多你也就到Number了,和Number的儿子们。ArrayList<? extends Number> al = new ArrayList<String>(); 错误
原因:Number的儿子们中包括Number自己,都没有你String这吗个东西。
下限(下边界):ArrayList<? super Integer> al = new ArrayList<Number>(); 正确
这句话是说,是Integer的父类,包含Integer自己,也就是说,最低也得是Integer,
或者是他的 爸爸,爷爷们。ArrayList<? super Integer> al = new ArrayList<Byte>(); 错误
原因:Byte既不是Integer的爸爸,也不是Integer的爷爷,更不是Integer自己,他是Inetger的兄弟,
所以错误。
Lz要理解多态 男人继承人 你给List规定里面必须是人 那么 男人自然也可以装到集合里
http://mysun.iteye.com/blog/851925
这样吧API中的addAll(Collection<? extends E> c)方法定义的时候,定义成addAll(Collection<E> c)
两个效果是一样的麽,
因为Collection<Integer> 并不是Collection<Object> 的子类。