为什么Java不支持模板参数类型的自动上传?
例如,除非新创建的Derived
实例将手动转换为Base
实例,否则以下类将无法编译:
public class Example implements Iterable<Base> {
@Override
public Iterator<Base> iterator() {
return Arrays.asList(new Derived()).iterator();
}
private class Base {
}
private class Derived extends Base {
}
}
答案 0 :(得分:3)
无需施法。
这里的问题是Arrays.asList(new Derived())
自然会尝试创建List<Derived>
,
然后在.iterator()
上调用List<Derived>
自然会给Iterator<Derived>
,
这是Iterator<Base>
的{{3}},因此您会收到编译错误。
您可以使用List<Derived>
指定您想要Arrays.<Base>asList
。
这有效,
因为您当然可以将Derived
个实例放入List<Base>
,
然后在.iterator()
上调用List<Base>
自然会产生Iterator<Base>
。
class Example implements Iterable<Base> {
@Override
public Iterator<Base> iterator() {
return Arrays.<Base>asList(new Derived()).iterator();
}
}