当前位置: 首页 > 知识库问答 >
问题:

在Java中导致编译错误的上界通配符

颛孙品
2023-03-14

我不明白为什么会出现这些编译错误:

1:

类型列表中的add(capture#1-of?extends Exec.Bird)方法不适用于参数(Exec.Sparrow)

2:

方法添加(捕获#2-of?扩展Exec.Bird)类型列表中的参数(Exec.鸟)

static class Bird{}
static class Sparrow extends Bird{}

public static void main(String[] args){
    List<? extends Bird> birds = new ArrayList<Bird>();
    birds.add(new Sparrow()); //#1 DOES NOT COMPILE
    birds.add(new Bird());// //#2 DOES NOT COMPILE
}

共有2个答案

娄浩荡
2023-03-14

您可以像下面这样实例化鸟类列表:

List<Bird> birds = new ArrayList<>();

完整代码:

import java.util.ArrayList;
import java.util.List;

public class Main {
    static class Bird{}
    static class Sparrow extends Bird{}

    public static void main(String[] args) {
        List<Bird> birds = new ArrayList<>();
        birds.add(new Sparrow());
        birds.add(new Bird());
    }
}
阳修永
2023-03-14

与<代码>列表

这意味着可以是麻雀,也可以是黑鸟。如果你试图将一只麻雀添加到一个只能包含黑鸟s的列表中,它将不起作用。出于同样的原因,你不能将鸟添加到一个可能是麻雀的列表中。

为了使事情顺利进行,您只需将列表的声明更改为:

List<Bird> birds = new ArrayList<>();

或使用下界:

List<? super Bird> birds = new ArrayList<>();

关于这个下界示例:声明实际上表示任何类型,即Bird或其超类之一。这意味着您可以安全地添加SparrowBird,因为两者都符合这些标准。

一般来说,你应该使用?超级 当您写入列表时,以及?延伸 当你阅读列表时。如果你同时在阅读和写作,你不应该使用界限。

这个答案提供了关于泛型的非常有用的信息。你绝对应该读一读。

 类似资料:
  • 问题内容: 我在项目中创建了一个工厂类,从理论上讲,该类允许我为任何(受支持的)给定类型创建管理器。与管理器进行交互使我可以更改给定类型的某些属性。我面临的问题是,当我尝试为泛型类型创建管理器时,编译器粉碎了我的希望和梦想。 以下代码是我正在使用的简化版本。我尝试创建“ test3Manager”的行将不会编译,并且我试图了解为什么会这样。它下面的线显示了一种“解决方法”,我正试图避免这种情况。

  • 与有界通配符相关的编译器错误 应兼容的不兼容通配符类型

  • 考虑以下示例: 我知道下界通配符接受通配符中给定类的所有超类(这里是IOException)。 为什么在上述情况下编译器会显示编译错误?

  • 问题内容: 对于这两个进口; 我收到此错误: 如何解决此错误? 问题答案: 该错误是由您的Eclipse配置引起的。您可以将其减少为警告。更好的是,使用不属于非公共API的Base64编码器。Apache Commons有一个,或者当您已经使用Java 1.8时,请使用。

  • 的类型应该是什么?Eclipse建议使用,但我试图获得更具体的信息。

  • 我在编译顺序时遇到编译器错误。java文件,即使它包含另一个打包类的导入语句。我不完全确定为什么会发生这种情况,但这是一个目录树,其中包含一些文件: > com/my/domain/Order.java 这个文件里面有下面的包和导入: com/my/utils/MyDate。此文件中包含以下包和导入: 编译顺序时出现编译器错误。java: 我仍然不知道如何解决这个问题后,试图从评论。这里有一些更多