Java解惑之Object、T(泛型)、?区别

2018-09-26  本文已影响0人  sofarsogoo_932d

先来看一段代码

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>"和"<?>",首先要区分开两种不同的场景:

  1. 声明一个泛型类或泛型方法
  2. 使用一个泛型类或泛型方法

类型参数“<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>两种,带有上下界的通配符

上一篇下一篇

猜你喜欢

热点阅读