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>{
}
我有以下代码设置。但这是不允许的,因为 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>{
}