向上转换模板参数类型

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();
        }
    }