为什么Java泛型的这种(错误)用法无法编译?

克里斯:

可能重复:
为什么这个通用的Java代码无法编译?

给出以下代码:

import java.util.Collections;
import java.util.List;

public class ComeGetSome {
  //TODO: private final Some<?> some = new Some();
  private final Some some = new Some();

  public static void main(String[] args) {
    new ComeGetSome().dude();
  }

  public void dude() {
    for (String str : some.getSomeStrings()) { //FIXME: does not compile!
      System.out.println(str);
    }
  }
}

class Some<T> {
  public List<String> getSomeStrings() {
    return Collections.<String> emptyList();
  }
}

它不会编译,因为会some.getSomeStrings()返回raw List但是方法签名指定它返回一个List<String>

它以某种方式与Some具有类型声明但被引用为原始类型的事实有关使用参考来Some<?>解决此问题。但是该方法与类的类型声明无关!

编译器为什么会这样?

波希米亚风格:

如果你使用泛型类的原料(无类型)的实例,那么它被视为是完全生的,即所有泛型类型的信息被忽略,即使被忽略的类型是相关的已省略了泛型类型。

这就是为什么

private final Some<?> some = new Some();

...修复了错误-它使用(虽然是通配符)类型化版本Some

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章