当前位置: 首页 > 面试题库 >

为什么Java编译器会抱怨将foreach与原始类型一起使用?

燕扬
2023-03-14
问题内容

在Java的for-each循环中使用泛型时,出现一个奇怪的编译器错误。这是Java编译器错误,还是我真的在这里遗漏了什么?

这是我全班的:

public class Generics<T extends Object> {
  public Generics(T myObject){
    // I didn't really need myObject
  }

  public List<String> getList(){
    List<String> list = new ArrayList<String>();
    list.add("w00t StackOverflow");
    return list;
  }

  public static void main(String...a){
    Generics generics = new Generics(new Object());
    for(String s : generics.getList()){
      System.out.println(s);
    }
  }
}

编译器抱怨for-each所在的行:“类型不匹配无法从元素类型Object转换为String。”
如果我进行了微妙的更改,它将编译为:

public static void main(String...a){
  Generics<?> generics = new Generics(new Object());
  for(String s : generics.getList()){
    System.out.println(s);
  }
}

我知道getList()确实使用泛型,但是我以完全不相关的方式使用它们。如果我尝试遍历T类型的某些内容并getList()返回a
List<T>或某种内容,我可以理解这一点,但是这里不是这种情况。的返回类型getList()应该与T完全无关,也不必在乎我是否对Generics对象使用原始类型…对吗?这些不应该是完全无关的,还是我真的在这里错过了什么吗?

请注意,如果执行此操作,代码也会编译,我认为这也应该等效于第一个代码

public static void main(String...a){
  Generics generics = new Generics(new Object());
  List<String> list = generics.getList();
  for(String s : list){
    System.out.println(s);
  }
}

问题答案:

区别在于,当您使用原始类型时,成员签名中的 所有 泛型引用也都将转换为其原始格式。如此有效地调用了一个具有如下所示签名的方法:

List getList()

现在,为什么要编译最终版本-尽管可以,但如果使用,则会出现警告-Xlint

Generics.java:16: warning: [unchecked] unchecked conversion
    List<String> list = generics.getList();
                                        ^

这类似于:

 List list = new ArrayList();
 List<String> strings = list;

…也可以编译,但下面带有警告-Xlint

这个故事的寓意是:不要使用原始类型!



 类似资料:
  • 问题内容: 游乐场执行失败:MyPlayground.playground:109:22:错误:无效使用’()’调用非函数类型’[ClassA.ClassB.Type]’的值时,让didNotCompile = ClassA.ClassB ^ ~~ 问题答案: 如您所述,它可以使用以下语法: 但是,如果我们声明一个: 因此,我想说这是一个错误,也应该无需输入别名即可工作。 更新 :Apple 已经

  • 我有一个实现Iterable的类,以便用户可以使用迭代器。我使用泛型来允许用户使用任何类型并使用该类。 这是下面的工作代码,没有警告- 但是,如果我将ListIterator定义如下- 我在 Eclipse 中收到警告, 当我在类后指定泛型类型时,它为什么会抱怨?为了能够在我的类中使用Type,我不应该这样做吗?我在定义CustomStackUsingArray时添加了类型,效果很好。

  • [Error]org.testng.testngException:无法将@Test annotated方法[testLoginPage]与[interface java.util.Map]插入。有关本机依赖项注入的更多信息,请参阅http://testng.org/doc/documentation-main.html#native-dependent ency-injection at org

  • 问题内容: 我使用SpringBoot进行REST Web服务开发,并使用SonarQube进行静态分析。 我的应用程序中有一些端点,它们的外观如下: SonarQube抱怨将ResponseEntity与通配符一起使用,并向我报告了一个 严重问题:“返回参数中不应使用通用通配符类型” 。 我想知道是否应该在SonarQube中禁用此验证,或者针对这些情况提出不同的返回类型。 你怎么看待这件事?

  • 我正在尝试编写一个列出目录中所有非隐藏文件的方法。但是,当我添加条件 我的代码无法编译,编译器返回以下错误: 我试图捕捉< code>IOException,但是编译器仍然拒绝编译我的代码。我遗漏了什么明显的东西吗?代码如下所示。