设置泛型对象的下限使用super,表示参数类型只能是该类型或该类型的父类:
声明对象:类名<? super 类> 对象名称
定义类:类名<泛型标签 extends类>{} 作者: 熊猫86 时间: 2013-12-13 00:25
“?”为通配符,<? extends T>是向上限制,即限定最大的范围是T类,也可以是其子类;<? super T>是向下限制,即限定最小的范围是T类,也可以是其父类。
举个例子,个人认为这个形式在new出的对象有多态时会用到:
Vector<? extends Number> x = new Vector<Integer>();
Vector<? super Integer> x = new Vector<Number>();
这两个其实主要还是看你的侧重点是想让其范围更加开阔还是让其别超出一定范围。作者: long362144768 时间: 2013-12-13 13:45
我的意思是,这两个应用在什么场合,举点带代码的小例子,什么时候用<? extends T>,什么时候用<? super T>,作者: 刘渝灵 时间: 2013-12-13 16:26 本帖最后由 刘渝灵 于 2013-12-13 16:29 编辑
泛型限定,上限:? extends E 下限:? super E.
往容器中存入元素时会用到上限,从容器中取出元素时会用到下限(父类类型接收子类引用)。
API Collection框架中用到上,下限的例子:ArrayList中addAll(Collection<? extends E> c);TreeSet中带比较器的构造方法:TreeSet(Comparator<? super E> c).例子说明:
class Person
{
private String name;
Person(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
}
class Student extends Person
{
Student(String name)
{
super(name);
}
}
class GenericDemo
{
public static void main(String[] args)
{
ArrayList<Person> al = new ArrayList<Person>();
al.add(new Person("abc01"));
ArrayList<Student> al1 = new ArrayList<Student>();
al1.add(new Student("abc001"));
}
//因为Student向上的父类有Object,所以在上面的例子中没有具体的实现下面的方法。
//<? super T>的用法
//此处可以接收Student或者其父类的对象。
public static void printColl2(ArrayList<? super Student> al)
{
Iterator<? super Student> it = al.iterator();
while(it.hasNext())
{
System.out.println(it.next().getName());
}
}