Java泛型Enum子类型接口

tan*_*rli 6 java generics enums types

鉴于以下设置:

  public class TestType {

  public static void main(String[] args) {
    List<Constants> list = new ArrayList<>();
    accept(list); //Does not compile
  }

  static void accept(Iterable<MyInterface> values) {
    for (MyInterface value : values) {
      value.doStuff();
    }
  }
}

interface MyInterface<T> {
  T doStuff();
}

enum Constants implements MyInterface<Integer> {
  ONE, TWO, THREE;

  @Override
  public Integer doStuff() {
    return ordinal();
  }
}
Run Code Online (Sandbox Code Playgroud)

为什么编译器不接受列表作为accept()的参数?

List延伸Iterable通过Collection,这不是问题.

另一方面,编译器告诉我 incompatible types: java.util.List<enums.Constants> cannot be converted to java.lang.Iterable<enums.MyInterface>

但常量是一个MyInterface ......不是吗?

Pow*_*ord 4

问题在于泛型如何工作。具体来说,泛型是非具体化的...这意味着即使 Constants 是 MyInterface 的子类,编译器也不会将其视为Iterable<enum.Constants>an 。Iterable<enum.MyInterface>

但是,有一种方法可以解决它: 通用通配符

如果你更改static void accept(Iterable<MyInterface> values)static void accept(Iterable<? extends MyInterface> values),它应该可以工作。