对Java泛型的一些疑问

java编程思想的泛型 15.10 通配符章节有这样一段代码

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对象时什么类型都不影响)

这是我的理解,不一定对。