向上转换模板参数类型
Up-casting template argument types
为什么 Java 不支持模板参数类型的自动向上转换?
例如,除非将新创建的 Derived
实例手动 转换为 Base
实例,否则以下 class 将无法编译:
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 {
}
}
不用投了。
这里的问题是 Arrays.asList(new Derived())
自然会尝试创建一个 List<Derived>
,
然后在 List<Derived>
上调用 .iterator()
自然会得到 Iterator<Derived>
,
这是 Iterator<Base>
的 not a sub-type,所以你会得到一个编译错误。
您可以使用 Arrays.<Base>asList
指定您想要 List<Derived>
。
这行得通,
因为您当然可以将 Derived
实例放入 List<Base>
,
然后在 List<Base>
上调用 .iterator()
自然会得到 Iterator<Base>
.
class Example implements Iterable<Base> {
@Override
public Iterator<Base> iterator() {
return Arrays.<Base>asList(new Derived()).iterator();
}
}
为什么 Java 不支持模板参数类型的自动向上转换?
例如,除非将新创建的 Derived
实例手动 转换为 Base
实例,否则以下 class 将无法编译:
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 {
}
}
不用投了。
这里的问题是 Arrays.asList(new Derived())
自然会尝试创建一个 List<Derived>
,
然后在 List<Derived>
上调用 .iterator()
自然会得到 Iterator<Derived>
,
这是 Iterator<Base>
的 not a sub-type,所以你会得到一个编译错误。
您可以使用 Arrays.<Base>asList
指定您想要 List<Derived>
。
这行得通,
因为您当然可以将 Derived
实例放入 List<Base>
,
然后在 List<Base>
上调用 .iterator()
自然会得到 Iterator<Base>
.
class Example implements Iterable<Base> {
@Override
public Iterator<Base> iterator() {
return Arrays.<Base>asList(new Derived()).iterator();
}
}