先讲解一下概念吧。
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.使用一个泛型类或者泛型方法
类型参数主要用于第一种,而无界通配符<?>主要用于第二种,使用泛型类或泛型方法。
声明泛型类的类型参数 class Box{ private T item1; private T item2; } 声明泛型类不能用无界通配符<?> //编译报错 class Box<?>{ private ? item1; private ? item2; }
有界通配符
表示该参数必须继承XXX 表示给参数为XXX的父对象