向上转换模板参数类型

时间:2015-08-29 10:20:13

标签: java upcasting

为什么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 {

    }
}

1 个答案:

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