相关疑难解决方法(0)

为什么Java编译器抱怨使用带有原始类型的foreach?

在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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

编译器抱怨带有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);
  }
}
Run Code Online (Sandbox Code Playgroud)

我知道getList()确实使用泛型,但它在我认为完全不相关的方式中使用它们.我可以理解这一点,如果我试图迭代T类型的东西并getList()返回一个List<T>或者什么东西,但事实并非如此.返回类型getList()应该与T完全无关,不应该关心我是否使用我的Generics对象的原始类型......对吗?难道这些不完全无关,还是我真的在这里遗漏了什么?

请注意,如果我这样做,代码也会编译,我认为它应该与第一个相同:

public static …
Run Code Online (Sandbox Code Playgroud)

java generics foreach raw-types

7
推荐指数
1
解决办法
1946
查看次数

标签 统计

foreach ×1

generics ×1

java ×1

raw-types ×1