我将在代码示例中解释我的问题。我有一个名为 getNewBaby()
的静态方法(我无法更改)它只返回一个 Animal
类。我需要以某种方式将那只动物变成狗。到目前为止,这是我两次失败的尝试:
public static class Animal
{
public void eat(){}
}
public static class Dog extends Animal
{
public Dog(Animal animal)
{
super = animal; // <-- error 1
}
public void bark(){}
}
.
public static Animal getNewBaby()
{
return new Animal( /* some future parameters */ );
}
public static void main()
{
//Attempt number 1:
Dog puppy1 = (Dog)(getNewBaby()); // <-- error 2
//Attempt number 2:
Dog puppy2 = new Dog(getNewBaby()); // <-- error 3
}
如何在不更改 getNewBaby()
方法中的任何内容的情况下解决此问题?
最佳答案
你试图做的是不可能的:你不能重新初始化 super
。
但是还有其他选择(假设您不能修改 getNewBaby
):
- 将您的向下转换包含在
try
/catch
语句中并捕获ClassCastException
- 使用
instanceof
检查实际类型,是否是Animal
、Dog
、Cat
等。并以此为基础 - 最佳选择 在
Animal
中声明可以在所有子类上重写的方法,从而实现解耦
编辑
这里有几个额外的主题 - 有点偏离/宽泛,但可能对您的设计有帮助。
- Java inheritance和类型转换
- factory pattern在 java
- Java generics
关于java - 如何改变一个类的super?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26274632/