以下代码:
List<? extends String> genericNames = new ArrayList<String>();
genericNames.add("John");
给出编译器错误:
此行有多个标记-类型列表中的方法add(capture#1-of?extends String)不适用于参数(String)-方法add(capture#1-of?)类型列表中的不适用于参数(字符串)
是什么导致了这个错误?我应该不能添加Strings或它的子类型,因为我正在类型参数中扩展String吗?
只想在GanGnaMStYleOverFlow的答案中添加一个,您可以将动物
的任何子类型的对象添加到以下列表中:
List<Animal> animals = new ArrayList<Animal>();
当你认为这个列表可以包含任何种类的动物时,你应该使用它。
另一方面,你应该使用List
String
是最终类,不能扩展。此外,对于您似乎感兴趣的情况,您不需要扩展关键字。List
将通配符与extends一起使用时,除了null之外,不能在集合中添加任何内容。另外,String是最后一门课;任何东西都不能延长绳子。
原因:如果允许,您可能只是在集合中添加了错误的类型。
示例:
class Animal {
}
class Dog extends Animal {
}
class Cat extends Animal {
}
现在你有了列表
public static void someMethod(List<? extends Animal> list){
list.add(new Dog()); //not valid
}
你可以这样调用这个方法:
List<Cat> catList = new ArrayList<Cat>();
someMethod(catList);
如果在使用带有扩展的通配符时允许在集合中添加,则只需在只接受Cat或子类型的集合中添加一个Dog。因此,您不能向使用具有上界的通配符的集合中添加任何内容。
下面的C#表达式导致我的程序中出现编译器错误: 不应该可以像那样使用字符串插值吗?还是根本不可能做到这一点?
我想在编译时向某些类添加一个泛型字段。为了实现这个目标,我按照官方文档实现了我自己的 AST 注释和转换类,并使用 AST 注释注释了所需的类。 但是我在编译时得到了这个错误: org . codehaus . groovy . control . multiplecompilationerrorsexception:启动失败:/home/.../groovy/Sample.groovy: -1:
问题内容: 我在项目中创建了一个工厂类,从理论上讲,该类允许我为任何(受支持的)给定类型创建管理器。与管理器进行交互使我可以更改给定类型的某些属性。我面临的问题是,当我尝试为泛型类型创建管理器时,编译器粉碎了我的希望和梦想。 以下代码是我正在使用的简化版本。我尝试创建“ test3Manager”的行将不会编译,并且我试图了解为什么会这样。它下面的线显示了一种“解决方法”,我正试图避免这种情况。
与有界通配符相关的编译器错误 应兼容的不兼容通配符类型
我得到以下编译错误: 当我编译(在Eclipse Juno中使用JDK 1.7.0)以下代码时: null 这样我就可以测试我所有的排序实现并测试它们。我想将结果与Java的排序实现进行比较,所以我也在编写这个接口的实现,它在内部只调用Java的排序方法。这就是我面对问题的地方。
我很好奇为什么下面的代码: 当使用编译时,生成以下代码: 当使用相同的编译时。我不明白为什么它不能识别仍未使用,而不管字符串长了一个字节。 这个问题与GCC9.1和CLANG8.0(在线:https://gcc.godbolt.org/z/p1z8ns)相关,因为在我看来,其他编译器要么完全删除未使用的变量(ellcc),要么为其生成代码,而不管字符串的长度如何。