package holder;
public class Holder<T> {
private T value;
public Holder() {
}
public Holder(T val) {
value = val;
}
public T get() {
return value;
}
public void set(T val) {
value = val;
}
}
package holder;
public class Wildcards {
static <T> T wildSubType(Holder<? extends T> holder, T arg) {
T t = holder.get();
return t;
}
static <T> void wildSuperType(Holder<? super T> holder, T arg) {
holder.set(arg);
Object obj = holder.get();
}
public static void main(String[] args) {
Holder<?> unbounded = new Holder<Long>();
Long lng = 1L;
Object r11 = wildSubType(unbounded, lng);
//The method wildSuperType(Holder<? super T>, T)
//in the type Wildcards is not applicable
//for the arguments (Holder<capture#5-of ?>, Long)
//wildSuperType(unbounded,lng);
}
}
为什么wildSubType(Holder<? extends T> holder, T arg) 方法可以接受 Holder<?> 作为参数 而 wildSuperType(Holder<? super T> holder, T arg) 却不能接受H older<?> 按照我自己的理解 应该两个都报错
------- 讲一个题外话 ----
我用工作电脑 两个都报错
用自己的电脑 就和书中写的一样 jdk都是1.8 很迷
是你声明时候的问题,
Holder<?> unbounded = new Holder<Long>();
你这样写在传入的时候还是解析为?类型,java中会提示编译错误(wildSuperType(Holder<? super T>,T)to (Holder<capture?>,Long)),只需要改为Holder<Lang> unbounded = new Holder<>();
至于wildSubType()方法因为是采用泛型上边界,所以无法set任何参数。你传入的arg参数根本就没用到,因此就没有报编译时错误(因为这个方法只是get了对象内的值,此时无论你的Holder对象时什么类型都不影响)
这是我的理解,不一定对。