使用类似<? extends Number>
通配符作为方法参数时表示:
-
方法内部可以调用获取
Number
引用的方法,例如:Number n = obj.getFirst();
; -
方法内部无法调用传入
Number
引用的方法(null
除外),例如:obj.setFirst(Number n);
即一句话总结:使用extends
通配符表示可以读,不能写。
使用类似<? super Integer>
通配符作为方法参数时表示:
-
方法内部可以调用传入
Integer
引用的方法,例如:obj.setFirst(Integer n);
; -
方法内部无法调用获取
Integer
引用的方法(Object
除外),例如:Integer n = obj.getFirst();
即使用super
通配符表示只能写不能读。
使用extends
和super
通配符要遵循PECS原则(Producer Extends Consumer Super)。
上述两种通配符限制作用的理解,可以从调用方法传入实参理解:
<? extends Number> : 传入的实参都是Number的子类,因此,调用get方法并使用Number作用引用变量没问题;但调用set方法,如果传入的实参是Integer实体,调用set方法时参数为Double实体对象,这样是不允许的。
<? super Integer> : 传入的实参都是Integer的父类,因此,调用set方法即是往Integer父类对象中放入Integer,set方法执行没问题;但调用get方法无法使用Integer的引用,因此不允许调用get方法。