美文网首页
关于〈? extends Class 〉和〈T extends

关于〈? extends Class 〉和〈T extends

作者: 楼兰King | 来源:发表于2022-08-23 15:56 被阅读0次

关于<? extends Class>和< T extends Class>,他们有什么区别。
在说明之前我们先讲一下通配符和边界

通配符

在Java中通配符用?表示。
在不确定泛型参数的具体类型时,可以使用?代替,
比如public void set(List<?> list)
在调用方法时,参数既可以是List<String>也可以是List<Integer>

边界

<? extends Number>表示上边界限定,泛型参数只能是Number及其子类,一旦实例化其他参数类型则会报错
<? super Number>表示下边界限定,泛型参数只能是Number和它的父类。

除此之外,我们发现其实在使用< T extends Number >也是有效的,也是限定参数类型T只能是Number及其子类。那么他们之间的区别是什么呢?其实也很简单,
T是用于泛型类和泛型方法中的定义,比如

//泛型类
class Demo1<T extends ClassDemo>{
    ......
}
//泛型方法
public <T extends ClassDemo> void set(T x) {
    ......
}

?是用于类的声明或者是参数,比如
public class GenericsTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
    ArrayList<? extends Number> str ;//在声明类时使用,不清楚泛型的类型,可用?表示,再用具体的类型实例化
    str = new ArrayList<Integer>();
    //str = new ArrayList<Double>();
    
    GenericsTest a = new GenericsTest();
    List<Double> list = new ArrayList<Double>();
    a.set(list);//在调用参数时直接使用具体的实参
    }
    public  void set(List<? extends Number> list) {//在定义时泛型参数不确定使用?表示
        
    }
}

相关文章

网友评论

      本文标题:关于〈? extends Class 〉和〈T extends

      本文链接:https://www.haomeiwen.com/subject/kzsggrtx.html