我有以下代码设置。但这是不允许的,因为 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实际上试图通过不允许这样做来实现什么? 哪些修改可以使它工作?
创建类实例时,它会调用超类型的初始值设定项。但是您不能使用通配符来创建实例,因此编译器会出错。您必须在此处提供确切的类型。
以下是 JLS §15.9 的摘录
如果类型参数紧跟在 new 之后,或者立即存在 在 (,则如果有任何类型参数,则为编译时错误 是通配符
一种解决方法是参数化类并将该类型变量传递给Iterable
接口实现。
interface CustomInterface<T extends MyBaseType> extends Iterable<T>{
}