Fra*_*nca 2 java arrays casting clone subclass
我有很多子类实现超类动物(狗,猫,老鼠等)
所以我这样做:
Animal[] arrayOfAnimals = new Animal[100];
Run Code Online (Sandbox Code Playgroud)
我把它放在狗,猫等物体上.
当我从中得到一些东西时,我做到了
If(arrayOfAnimals[1] instanceof Dog) {
((Dog)(arrayOfAnimals[1])).speak();
}
else if(arrayOfAnimals[1] instanceof Cat) {
((Cat)(arrayOfAnimals[1])).speak();
}
Run Code Online (Sandbox Code Playgroud)
因为我需要知道动物是猫还是狗,因为,例如,每个人都说不同.
现在假设我有许多动物的子类,我会连续得到许多"如果......"
我的问题是:有没有办法避免这种情况?我已经尝试过使用接口(Animal - > interface,Dog,Cat等实现动物),但在我的项目中,数组必须是可克隆的,如果Animal是一个数组,你就不能克隆一个数组"Animal [] arrayOfAnimals"接口(不会克隆该数组中的对象)
因为我需要知道动物是猫还是狗,因为,例如,每个人都说不同.
这听起来像是一个实现细节 - 如果每个动物都能以某种形式说话,你应该把这个speak()
方法Animal
作为一个抽象的方法.然后,每个子类将覆盖它以提供实现.然后你可以使用
arrayOfAnimals[1].speak();
Run Code Online (Sandbox Code Playgroud)
...和多态将负责使用正确的实现.
你可以克隆一个接口类型的数组,顺便说一句:
interface Foo {
}
class FooImpl implements Foo {
}
public class Test {
public static void main(String[] args) {
Foo[] foos = { new FooImpl() };
Foo[] clone = (Foo[]) foos.clone();
System.out.println(foos[0] == clone[0]); // true
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,无论涉及何种类型,调用clone()
数组都不会克隆每个元素 - 新数组将包含与旧数组相同的引用.这是一个浅薄的副本.如果你想这样做,你必须自己编写代码(或找到第三方库).
归档时间: |
|
查看次数: |
1645 次 |
最近记录: |