使用带有下限通配符的增强型for循环

时间:2015-05-21 14:12:08

标签: java generics for-loop

我有这个for循环:

for (int j = 0; j < list.size(); j++) {
    System.out.print(list.get(j) + " ");
}

方法的签名是:

public static void addNumbers(List<? super Number> anoList)

列表声明为:

static List<? super Number> list2;

static List list2;

就此而言。

到目前为止一切顺利。但随后Netbeans给出了将for循环转换为增强for循环的提示。当我申请时,我得到:

    for (? super Number anoList1 : anoList) {
        System.out.print(anoList1 + " ");
    }

不起作用并产生大量错误。例如:cannot find anoList1. expected: expected; expected

我已经尝试了几种方法来摆脱错误,但它们都没有起作用。

enhanced for loop的正确方法是什么?

从我读过的其他主题来看,建议不要使用enhanced for loop并保持原样。

3 个答案:

答案 0 :(得分:5)

  

这种增强的for循环的正确写法是什么?

for (Object obj : anyList) {...}

由于List<? super Number>是一个元素列表,可以是Number的任何超类型(包括Object),因此我们对列表的实际类型的唯一保证是{{ 1}}。

答案 1 :(得分:3)

此处? super Number表示该列表可能包含任何类型的元素,其类型为Number的超类型。实际上,这意味着除了它们是Object类型的后代之外,没有任何关于列表元素类型的保证。这种方法签名实际上看起来没用。可能你想用

public static void addNumbers(List<? extends Number> anoList)

这意味着列表元素类型是Number的某些子类型,如List<Integer>List<Double>

答案 2 :(得分:1)

我依靠Tagir给出的答案。你会发现这不会编译

public static void addNumbers(List<? super Number> anoList){
    for(Number n : anoList){ // Fail

    }
}

失败
Error:(29, 24) java: incompatible types: capture#1 of ? super java.lang.Number cannot be converted to java.lang.Number

但这很好

public static void addNumbers(List<? extends Number> anoList){
    for(Number n : anoList){

    }
}

正如Tagir所提到的,您可能希望使用extends而不是super。但是,如果您确实需要? super Number,那么Radiodef的答案是增强for循环的唯一选择。