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

通过使用泛型“extends”添加字符串会导致编译器错误

叶建柏
2023-03-14

以下代码:

List<? extends String> genericNames = new ArrayList<String>();
genericNames.add("John");

给出编译器错误:

此行有多个标记-类型列表中的方法add(capture#1-of?extends String)不适用于参数(String)-方法add(capture#1-of?)类型列表中的不适用于参数(字符串

是什么导致了这个错误?我应该不能添加Strings或它的子类型,因为我正在类型参数中扩展String吗?

共有3个答案

萧展鹏
2023-03-14

只想在GanGnaMStYleOverFlow的答案中添加一个,您可以将动物的任何子类型的对象添加到以下列表中:

List<Animal> animals = new ArrayList<Animal>();

当你认为这个列表可以包含任何种类的动物时,你应该使用它。

另一方面,你应该使用List

翟迪
2023-03-14

String是最终类,不能扩展。此外,对于您似乎感兴趣的情况,您不需要扩展关键字。List

宿淳
2023-03-14

将通配符与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),要么为其生成代码,而不管字符串的长度如何。