先来看一段代码
List<Object> list1 = new ArrayList<>();
list1.add("hello");
list1.add(0);
List<String> list2 = new ArrayList<>();
list2.add("world");
List<?> list3 = new ArrayList<>();
list3.add("1");
我们知道List本省就是一个泛型类
第一段代码中,我们传入了一个Object类型,当我们调用add方法时,可与传入任何类型的参数,因为任何类都是Object的子类
第二段代码中,我们传入了一个String类型,相当于已经限定了T的类型就是String类型,因此当我们调用add方法时,只能传入String类型
第三段代码中,在调用add方法时,编译器会报错
区别
三者的定义
Object,任何类的父类
T,泛型参数
?,类型通配符
Object和<T>的区别
由于Object是任何类的父类,因此它的范围会非常广
T,在传入的时候就已经限定了参数的类型
<T>和<?>的区别
讨论“<T>"和"<?>",首先要区分开两种不同的场景:
- 声明一个泛型类或泛型方法
- 使用一个泛型类或泛型方法
类型参数“<T>”主要用于第一种,声明泛型类或泛型方法。 无界通配符“<?>”主要用于第二种,使用泛型类或泛型方法。
<T>声明泛型类的类型参数
class Box<T>{
private T item1;
private T item2;
}
声明泛型类不能用无界通配符<?>
//编译报错
class Box<?>{
private ? item1;
private ? item2;
}
有界通配符<? extends XXX>,<? super XXX>
<? extends XXX>或者<? super XXX>两种,带有上下界的通配符
网友评论