通配符类型与有界类型之间的区别

时间:2016-11-08 11:45:13

标签: java

public static void main(String args[]) {
    List<Double> doubleList = new ArrayList<>();
    doubleList.add(new Double(101.215D));
    doubleList.add(new Double(102.215D));
    doubleList.add(new Double(103.215D));

    printIntValue1(doubleList);
    System.out.println("*******");
    printIntValue2(doubleList);
}


//bounded parameter
public static <T extends Number> void printIntValue1(List<T> list){
    for(T num : list){
        System.out.println(num.intValue());
    }
}
//Wildcard parametr
public static  void printIntValue2(List<? extends Number> list){
    for(Number num : list){
        System.out.println(num.intValue());
    }
}

如上述两种方法,两者都给出相同的结果。 任何人都可以告诉我,如果已经完成了有界类型的所有工作,那么为什么存在通配符的概念?通配符是否会执行其他有限类型的其他工作?

1 个答案:

答案 0 :(得分:1)

我认为从你的例子来看,使用通配符几乎没有什么好处。 但我相信,引入通配符是为了支持使用相关类型参数的泛型类型的赋值(或相关结构)。

考虑:

List<Number> numberList = new ArrayList<Double>(); //Won't compile

对比:

List<? extends Number> anyNumberList = null;
anyNumberList = new ArrayList<Double>();
anyNumberList = new ArrayList<Integer>();

第二个片段是有效代码。

我同意,从方法参数类型的角度来看,通配符类型并没有显示出特别的优势。