hg460713171 2019-11-18 14:28 采纳率: 25%
浏览 168
已采纳

对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 很迷

  • 写回答

1条回答 默认 最新

  • 「已注销」 2019-11-20 09:12
    关注
    是你声明时候的问题,
    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对象时什么类型都不影响)

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?