Java 向上转换模板参数类型

Java 向上转换模板参数类型,java,upcasting,Java,Upcasting,为什么Java不支持自动向上转换模板参数类型 例如,除非将新创建的派生的实例手动强制转换为基实例,否则将不会编译以下类: public class Example implements Iterable<Base> { @Override public Iterator<Base> iterator() { return Arrays.asList(new Derived()).iterator(); } private

为什么Java不支持自动向上转换模板参数类型

例如,除非将新创建的
派生的
实例手动强制转换为
实例,否则将不会编译以下类:

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 {

    }
}
公共类示例实现了Iterable{
@凌驾
公共迭代器迭代器(){
返回Arrays.asList(新派生的()).iterator();
}
私人阶级基础{
}
私有类派生扩展基{
}
}
无需强制转换。 这里的问题是,
Arrays.asList(new-Derived())
自然地尝试创建一个
列表
, 然后在
列表上调用
.iterator()
,自然会得到一个
迭代器,
它是迭代器的
,因此会出现编译错误

您可以使用
数组.asList
指定需要一个
列表。
这很有效,
因为您当然可以将
派生的
实例放入
列表
, 然后在
列表上调用
.iterator()
,自然会得到一个
迭代器

类示例实现了Iterable{
@凌驾
公共迭代器迭代器(){
返回Arrays.asList(新派生的()).iterator();
}
}
无需强制转换。 这里的问题是,
Arrays.asList(new-Derived())
自然地尝试创建一个
列表
, 然后在
列表上调用
.iterator()
,自然会得到一个
迭代器,
它是迭代器的
,因此会出现编译错误

您可以使用
数组.asList
指定需要一个
列表。
这很有效,
因为您当然可以将
派生的
实例放入
列表
, 然后在
列表上调用
.iterator()
,自然会得到一个
迭代器

类示例实现了Iterable{
@凌驾
公共迭代器迭代器(){
返回Arrays.asList(新派生的()).iterator();
}
}
无需强制转换。 这里的问题是,
Arrays.asList(new-Derived())
自然地尝试创建一个
列表
, 然后在
列表上调用
.iterator()
,自然会得到一个
迭代器,
它是迭代器的
,因此会出现编译错误

您可以使用
数组.asList
指定需要一个
列表。
这很有效,
因为您当然可以将
派生的
实例放入
列表
, 然后在
列表上调用
.iterator()
,自然会得到一个
迭代器

类示例实现了Iterable{
@凌驾
公共迭代器迭代器(){
返回Arrays.asList(新派生的()).iterator();
}
}
无需强制转换。 这里的问题是,
Arrays.asList(new-Derived())
自然地尝试创建一个
列表
, 然后在
列表上调用
.iterator()
,自然会得到一个
迭代器,
它是迭代器的
,因此会出现编译错误

您可以使用
数组.asList
指定需要一个
列表。
这很有效,
因为您当然可以将
派生的
实例放入
列表
, 然后在
列表上调用
.iterator()
,自然会得到一个
迭代器

类示例实现了Iterable{
@凌驾
公共迭代器迭代器(){
返回Arrays.asList(新派生的()).iterator();
}
}
Return
IteratorReturn
IteratorReturn
IteratorReturn
Iterator
    class Example implements Iterable<Base> {
        @Override
        public Iterator<Base> iterator() {
            return Arrays.<Base>asList(new Derived()).iterator();
        }
    }