使用类似<? 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方法。
本文详细解析了Java中泛型通配符<?>的使用,特别是extends和super关键字的差异。使用<?> extends Number作为参数表示可以读取Number及其子类对象,但不能写入。而<?> super Integer则表示可以写入Integer及其父类对象,但无法读取。遵循PECS原则,理解这两种通配符对于泛型方法的签名设计至关重要。
273





