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

前端之家收集整理的这篇文章主要介绍了java – 有界类型参数和上限通配符之间的差异前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我知道有一个类似的问题已经发布了,虽然我认为我有一些不同…

假设你有两种方法

// 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
}

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

原文链接:https://www.f2er.com/java/126689.html

猜你在找的Java相关文章