加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 有界类型参数和上限通配符之间的差异

发布时间:2020-12-15 00:08:44 所属栏目:Java 来源:网络整理
导读:我知道有一个类似的问题已经发布了,虽然我认为我有一些不同… 假设你有两种方法: // Bounded type parameterprivate static T extends Numbervoid processList(ListT someList){}// Upper bound wildcardprivate static void processList2(List? extends Nu
我知道有一个类似的问题已经发布了,虽然我认为我有一些不同…

假设你有两种方法:

// Bounded type parameter
private static <T extends Number>void processList(List<T> someList){

}

// Upper bound wildcard
private static void processList2(List<? extends Number> someList){
    // ...
}

据我所知,两种方法都接受参数,即Number或Number类型的列表.但是两种方法之间是什么呢?

解决方法

在编译期间,两种语法之间有几个区别:

>使用第一种语法,您可以添加元素到someList,但第二种,你不能.这通常被称为PECS,并且通常被称为PUT和GET原理.
>使用第一种语法,您可以使用类型参数T的句柄,以便您可以使用它来执行某些操作,例如在类型T的方法中定义局部变量,转换类型T的引用,调用方法在由T代表的类等.但是使用第二种语法,您没有该类型的句柄,因此您不能执行任何操作.
>第一种方法实际上可以从第二种方法调用
捕获通配符.这是capture的最常见的方法
通配符通过辅助方法.

private static <T extends Number> void processList(List<T> someList) {
    T n = someList.get(0);
    someList.add(1,n); //addition allowed.   
}

private static void processList2(List<? extends Number> someList) {
    Number n = someList.get(0);
    //someList.add(1,n);//Compilation error. Addition not allowed.
    processList(someList);//Helper method for capturing the wildcard
}

请注意,由于泛型是编译时间糖,所以在更广泛的层面上的这些差异仅限于编译.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读