我有以下代码设置。但这是不允许的,因为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
如果TypeArguments紧接在new之后,或者紧接在(之前,那么如果任何类型参数是通配符,则会出现编译时错误。
一个变通的办法是给你的类设置参数,并将类型变量传递给 Iterable
接口实现。
interface CustomInterface<T extends MyBaseType> extends Iterable<T>{
}