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()方法,因为返回类型不匹配,尽管两个类都在同一方向上扩展.谁能解释一下?
你的理解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> 返回类型来解决您的问题.
编辑 上面你的评论,如果你没有超级级别的控制权,恐怕你什么都做不了.
| 归档时间: |
|
| 查看次数: |
1110 次 |
| 最近记录: |