当我们不知道或者不关心实际操作类型的时候我们可以使用无限通配符,当我们不指定或者不关心操作类型,但是又想进行一定范围限制的时候,我们可以通过添加上限或下限来起到限制作用。
无限通配符表示的是未知类型,表示不关心或者不能确定实际操作的类型,一般配合容器类使用。
public void testV(List<?> list) {}
需要注意的是: 无限通配符只能读的能力,没有写的能力。
public void testV(List<?> list) {
Object o = list.get(0);
//编译器不允许该操作
// list.add("jaljal");
}
上面的List<?>为无限通配符,他只能使用get()获取元素,但不能使用add()方法添加元素。(即使修改元素也不被允许)
定义了上限,期只有读的能力。此方式表示参数化的类型可能是所指定的类型,或者是此类型的子类。
//t1要么是Test2,要么是Test2的子类
public void testC(Test1<? extends Test2> t1) {
Test2 value = t1.getValue();
System.out.println("testC中的:" + value.getT());
}
定义了下限,有读的能力以及部分写的能力,子类可以写入父类。此方式表示参数化的类型可能是指定的类型,或者是此类型的父类
//t1要么是Test5,要么是Test5的父类
public void testB(Test1<? super Test5> t1) {
//子类代替父类
Test2 value = (Test2) t1.getValue();
System.out.println(value.getT());
}
如果返回值依赖类型参数,不能使用通配符作为返回值。可以使用类型参数返回方式:
public <T> T testA(T t, Test1<T> test1) {
System.out.println("这是传入的T:" + t);
t = test1.t;
System.out.println("这是赋值后的T:" + t);
return t;
}
泛型中只有通配符可以使用super关键字,类型参数不支持这种写法。
提枪策马乘胜追击04-21 20:01
代码小兵92504-17 16:07
代码小兵98804-25 13:57
杨晶珍05-11 14:54