Java语言规范定义:
jls7: 4.5.1: unlike ordinary type varables declared in a method signature, no type inference is required when using a wildcard.
<不同于普通的类型变量声明,通配符方式并不会进行类型推断>说明:不进行类型推断的话实际上就限制了数据的放入和取出。
简而言之,需要明确的告诉编译器此数据的上界和下界,否则编译时报错。
jls7:The null reference can always be assigned or cast to any reference type
从上面的Java语言规范中可以得出:
Java中所有类的顶级父类是Object,
可以认为
Null是所有类的子类。
举个例子:
<? extends T>:通配符?的类型在Null和T之间。 <? extends T>只能作为消费者,而不能放入类型的原因就在这里,编译器
不能确定放入的是什么类型,Null可以转化为任意类型;换一种说法,编译器不知道类型的上界,只清楚类型的下界。如下图:
<? super T>:
通配符?的类型在T和Object之间。 <? super T>可以作为消费者也可以作为生产者的的原因就在这里,编译器
很清楚放入的类型下界是T,上界是Object。如下图:
<? extends T>和
<? super T>在使用时,只能转化为其上界,相信大家已经明白了吧。
PS:个人原创,欢迎转载