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

问题描述 投票:0回答:1

我有以下代码设置。但这是不允许的,因为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不允许这样做到底是想达到什么目的?

java generics wildcard iterable
1个回答
3
投票

当一个类实例被创建时,它会调用超级类型的初始化器。但是你不能使用通配符来创建实例,因此你的编译器给出了一个错误。你必须在这里提供准确的类型。

下面是JLS中的一段摘录。§15.9

如果TypeArguments紧接在new之后,或者紧接在(之前,那么如果任何类型参数是通配符,则会出现编译时错误。

一个变通的办法是给你的类设置参数,并将类型变量传递给 Iterable 接口实现。

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

} 
© www.soinside.com 2019 - 2024. All rights reserved.