关于Object类,泛型与 ? 的区别

2,593 阅读1分钟

先讲解一下概念吧。

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的父对象