Java 中的 Iterable 不允许使用通配符

Wildcard not allowed for Iterable in Java

我有以下代码设置。但这是不允许的,因为 Iterable 不允许使用通配符。

public interface CustomInterface extends Iterable<? extends MyBaseType>{....}

CustomTypeA extends MyBaseType{....}

class CustomImpl implements CustomInterface {
 List<CustomTypeA> listA = new ArrayList();

 @Override
 public Iterator<CustomTypeA> iterator() {
    return listA.iterator();
 }
}

实际上 Java 试图通过不允许这样做来实现什么? 哪些修改会使它起作用?

创建 class 实例时,它会调用超类型的初始化程序。但是您不能使用通配符来创建实例,因此您的编译器会出错。您必须在此处提供确切的类型。

这是 JLS 的摘录 §15.9

If TypeArguments is present immediately after new, or immediately before (, then it is a compile-time error if any of the type arguments are wildcards

一种解决方法是参数化您的 class 并将该类型变量传递给 Iterable 接口实现。

interface CustomInterface<T extends MyBaseType> extends Iterable<T>{

}