如何在java中重写泛型列表返回类型
我试图重写在子类中返回type as list的方法,如下例所示,由于泛型问题,我无法在我的子类中这样做。我无法更改我的超级类代码,因此如何解决该问题?任何人都可以指引我。。。非常感谢
无法更新的超类:
public class Animal {
private String legs;
}
public class TestSuper {
public List<Animal> addAnimals() {
return animals;
}
}
子类:
public class Dog extends Animal {
private String sound;
}
public class TestSub extends TestSuper {
public List<Dog> addAnimals() { --> I need to override this method but want return type as List of dogs
return null;
}
}
# 1 楼答案
如果
Dog
是Animal
的一个子类,您可能会这样做以下签名:
那就去吧
在班级里
或者你可以让超类成为泛型
<T>
和实现类<Dog>
# 2 楼答案
不能将列表的泛型类型更改为该泛型类型的子类型。问题是,对任何实例的引用都可能是该实例的子类型。让我们看看这个例子
因此,您将
Cat
添加到只应包含Dogs
的列表中,这是错误的同样,在Overrided方法中,您不能将列表的泛型类型更改为具有该泛型类型的超类型的列表(如
List<Dog>
到List<Animal>
)。为什么?让我们看看这个例子在亚型中,我们有动物列表,所以有可能
get(0)
会返回猫如果你能在你的类中修改代码,那么试试这种方法
# 3 楼答案
如果超级类真的不能更新,恐怕你就是不能
如果您能够更新超级类:
在
TestSuper
中,必须使用public List<? extends Animal> addAnimals()
而不是public List<Animal> addAnimals()
您还有什么其他解决方案:
您可以使用这样一种实用方法:
然后,打电话:
# 4 楼答案
这是不可能的。super class合同规定,如果您有:
以下代码必须有效:
您在
TestSub
类中的重写将违反这一点,因为您无法将Cat
添加到List<Dog>
。因为这违反了面向对象类型系统的一个基本原则,所以你不会找到一个完美的解决方法来解决这个限制将超类更改为使用
List<? extends Animal>
的建议会起作用,因为您无法向该列表中添加任何内容# 5 楼答案
您需要让TestSuper使用泛型来真正正确地工作