关于Object类,泛型与 ? 的区别
2019-07-03 本文已影响0人
先生zeng
先讲解一下概念吧。
Object类,是在java中所有的类的父类。还包括了一些基本方法:
equal、toString、wait、hashCode,感兴趣的可以看我之前的源码分析。
T 这是一个泛型的意思。在类的前面修饰,表示这是一个泛型类。
? 这是一个类型通配符。
List<Object> list=new ArrayList<>();
List<String> list=new ArrayList<>();
List<T> list=new ArrayList<>();
这是一组声明。
第一个声明,我们在加入list中的对象的时候,可以加入任何对象,因为Object是所有对象的子类,这里是内部符合依赖倒转原则,任何父类的对象所代表的参数,都可以用子类代替。
第二个,这个在声明的时候就已经限定死了,只能加入String类。
第三个表达式,在声明的时候,设置成泛型,在第一次加入对象的时候,才会确认里面必须存放什么类型的对象。如果是String,就只能add(String s).
再来讲讲?这个通配符。
对比T泛型,就需要先区别一下两种场景:
1.声明一个泛型类或者泛型方法
2.使用一个泛型类或者泛型方法
类型参数<T>主要用于第一种,而无界通配符<?>主要用于第二种,使用泛型类或泛型方法。
<T>声明泛型类的类型参数
class Box<T>{
private T item1;
private T item2;
}
声明泛型类不能用无界通配符<?>
//编译报错
class Box<?>{
private ? item1;
private ? item2;
}
有界通配符
<? extends XXX> 表示该参数必须继承XXX
<? super XXX> 表示给参数为XXX的父对象