有人可以澄清Java(6)中的协变返回类型吗?

end*_*ser 4 java generics overriding covariance

我是在询问协变返回类型.我有一些生成的代码,我正在尝试扩展和使用.我们假设我有以下两个类:

public class SuperParent
{
    public List<SuperChild> getList()
    {
        return new ArrayList<SuperChild>();
    }
}
public class SuperChild
{
}
Run Code Online (Sandbox Code Playgroud)

现在,我想从这些中派生出新的类:

public class SubParent extends SuperParent
{
    public List<SubChild> getList()
    {
        return new ArrayList<SubChild>();
    }
}
public class SubChild extends SuperChild
{
}
Run Code Online (Sandbox Code Playgroud)

问题是,显然我不能覆盖getList()方法,因为返回类型不匹配,尽管两个类都在同一方向上扩展.谁能解释一下?

Rav*_*att 5

你的理解co-variant是正确的,但usasge不是.List<SubChild>是不一样的List<SuperChild>

考虑到这一点,List<Animals>并不是一样的,List<Dogs>如果允许,事情可能会出现严重错误.A Dog是一个Animal但如果允许分配如下:

List<Dogs> dogs = new ArrayList<Dogs>();
List<Animals> animals = dogs; //not allowed.
Run Code Online (Sandbox Code Playgroud)

然后当你添加一只猫时会发生什么?

animals.add(new Cat());
Run Code Online (Sandbox Code Playgroud)

Dog dog = dogs.get(0); //fail
Run Code Online (Sandbox Code Playgroud)

所以不允许这样做.

由于许多其他人的消化,使用List<? extends SuperChild> 返回类型来解决您的问题.

编辑 上面你的评论,如果你没有超级级别的控制权,恐怕你什么都做不了.