Java 使用带下界通配符的增强for循环

Java 使用带下界通配符的增强for循环,java,generics,for-loop,Java,Generics,For Loop,我有一个循环: for (int j = 0; j < list.size(); j++) { System.out.print(list.get(j) + " "); } 就此而言 到目前为止一切都很好。但是Netbeans给出了一个将for循环转换为增强的for循环的提示。当我申请时,我得到: for (? super Number anoList1 : anoList) { System.out.print(anoList1 + " ");

我有一个循环:

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

到目前为止一切都很好。但是Netbeans给出了一个将for循环转换为增强的for循环的提示。当我申请时,我得到:

    for (? super Number anoList1 : anoList) {
        System.out.print(anoList1 + " ");
    }
这不起作用,并且会产生很多错误。原因之一:找不到anoList1和。预期的:预期的;预料之中

我尝试了几种方法来消除错误,但没有一种有效

编写此增强for循环的正确方法是什么

从我读过的其他主题来看,建议根本不要使用增强的for循环,保持原样

编写此增强for循环的正确方法是什么

自从一份名单 编写此增强for循环的正确方法是什么

因为这里有一个列表?super Number意味着列表可以包含任何类型的元素,这些元素都是Number的超类型。实际上,这意味着列表元素类型除了是对象类型的后代之外,不能保证任何东西。这种方法签名实际上看起来毫无用处。也许你想用

public static void addNumbers(List<? extends Number> anoList)
这意味着列表元素类型是一些数字的子类型,比如list或list?super Number意味着列表可以包含任何类型的元素,这些元素都是Number的超类型。实际上,这意味着列表元素类型除了是对象类型的后代之外,不能保证任何东西。这种方法签名实际上看起来毫无用处。也许你想用

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

这意味着列表元素类型是一些数字的子类型,比如list或list。

我相信塔吉尔给出的答案。您将看到这不会编译

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

    }
}
但这很好

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

    }
}

正如Tagir提到的,您可能希望使用extends而不是super。然而,如果你真的需要?超级数字,那么Radiodef的答案是增强型for循环的唯一选项。

我将使用Tagir给出的答案。您将看到这不会编译

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

    }
}
但这很好

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

    }
}

正如Tagir提到的,您可能希望使用extends而不是super。然而,如果你真的需要?超级数字,则Radiodef的答案是增强for循环的唯一选项。

使用对象而不是?循环中的超级数。使用对象而不是?循环中的超级数字。问题是它来自java教程https://docs.oracle.com/javase/tutorial/java/generics/lowerBounded.html Netbeans建议将其转换为不正确的增强for循环。这适用于向列表中添加项。您正在从列表中获取它们。您应该将类型限制为执行操作所需的抽象。再说一次,如果你一定要把它当礼物?超级数字,然后使用Radiodef的答案。问题是它来自java教程https://docs.oracle.com/javase/tutorial/java/generics/lowerBounded.html Netbeans建议将其转换为不正确的增强for循环。这适用于向列表中添加项。您正在从列表中获取它们。您应该将类型限制为执行操作所需的抽象。再说一次,如果你一定要把它当礼物?超级号码,然后你使用Radiodef的答案。这是有效的。完成后,Netbeans建议将其转换为函数操作:list.stream.forEachlist1->{…};};:好电话。我很困惑为什么netbeans添加了没有菱形操作符的LowerWildbundcard。@WonderWorld,看起来像是netbeans的bug。报告,这是有效的。完成后,Netbeans建议将其转换为函数操作:list.stream.forEachlist1->{…};};:好电话。我很困惑为什么netbeans添加了没有菱形操作符的LowerWildbundcard。@WonderWorld,看起来像是netbeans的bug。报告它。
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){

    }
}