我不明白为什么会出现这些编译错误:
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
}
您可以像下面这样实例化鸟类
列表:
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());
}
}
与<代码>列表
这意味着可以是
麻雀
,也可以是黑鸟
。如果你试图将一只麻雀
添加到一个只能包含黑鸟
s的列表中,它将不起作用。出于同样的原因,你不能将鸟添加到一个可能是麻雀的列表中。
为了使事情顺利进行,您只需将列表的声明更改为:
List<Bird> birds = new ArrayList<>();
或使用下界:
List<? super Bird> birds = new ArrayList<>();
关于这个下界示例:声明实际上表示任何类型,即Bird
或其超类之一。这意味着您可以安全地添加Sparrow
或Bird
,因为两者都符合这些标准。
一般来说,你应该使用?超级
当您写入列表时,以及
?延伸
当你阅读列表时。如果你同时在阅读和写作,你不应该使用界限。
这个答案提供了关于泛型的非常有用的信息。你绝对应该读一读。
问题内容: 我在项目中创建了一个工厂类,从理论上讲,该类允许我为任何(受支持的)给定类型创建管理器。与管理器进行交互使我可以更改给定类型的某些属性。我面临的问题是,当我尝试为泛型类型创建管理器时,编译器粉碎了我的希望和梦想。 以下代码是我正在使用的简化版本。我尝试创建“ test3Manager”的行将不会编译,并且我试图了解为什么会这样。它下面的线显示了一种“解决方法”,我正试图避免这种情况。
与有界通配符相关的编译器错误 应兼容的不兼容通配符类型
考虑以下示例: 我知道下界通配符接受通配符中给定类的所有超类(这里是IOException)。 为什么在上述情况下编译器会显示编译错误?
问题内容: 对于这两个进口; 我收到此错误: 如何解决此错误? 问题答案: 该错误是由您的Eclipse配置引起的。您可以将其减少为警告。更好的是,使用不属于非公共API的Base64编码器。Apache Commons有一个,或者当您已经使用Java 1.8时,请使用。
的类型应该是什么?Eclipse建议使用,但我试图获得更具体的信息。
我在编译顺序时遇到编译器错误。java文件,即使它包含另一个打包类的导入语句。我不完全确定为什么会发生这种情况,但这是一个目录树,其中包含一些文件: > com/my/domain/Order.java 这个文件里面有下面的包和导入: com/my/utils/MyDate。此文件中包含以下包和导入: 编译顺序时出现编译器错误。java: 我仍然不知道如何解决这个问题后,试图从评论。这里有一些更多