以下情况是否可行:
Animal
的对象池,名为AnimalPool
Animal
myAnimal
个对象(名为AnimalPool
)
myAnimal
投放到Cat
Cat
特定字段myAnimal
存储到Animal
(比如索引0)Cat
并检查我在4中设置的字段。答案 0 :(得分:2)
在第2点你创建Animal然后在3中你不能把它投射到Cat
如果
class Animal {
}
class Cat extends Animal {
private String mewTone;
public void setMewTone(String t){
this.mewTone = t;
}
}
你可以拥有Animal的游泳池,但是如果你想要投射到Cat并使用方法setMewTone,那么给定的对象必须是Cat。你可以检查一下。例如:
Animal animal = objectPool.get();
if(animal instanceof Cat){
Cat castedToCat = (Cat)animal;
castedToCat.setMewTone("horrible");
} else {
System.out.println("This is not a cat.");
}
所以当你运行它时:
ObjectPool<Animal> objectPool = new ObjectPool<Animal>();
objectPool.add(new Animal());
Animal animal = objectPool.get();
((Cat)animal).setMewTone("sth");
您将获得java.lang.ClassCastException: Animal cannot be cast to Cat
答案 1 :(得分:2)
我认为你可以做你想做的事情,而不是你想要做的事情。你的AnimalPool本质上是一个动物“工厂”(查找工厂模式,它可能有所帮助,但它不是这里的重要部分。),并且作为“动物”的集合加倍。制作一个“动物”对象,它拥有所有动物共有的所有方法和属性。然后制作你需要的动物,如“猫”和“狗”,并从“动物”的基类中获取它们。然后在“AnimalPool”中添加函数以创建和返回特定类型的Animal,例如getDog()和getCat(),或者使用参数创建一个函数。使用AnimalPool工厂创建该特定类型,并且因为它派生自“Animal”,您可以将其添加到“Animal”类型的列表中。从AnimalPool列表中检索动物时,您将能够将它们转换为适当的类型。根据您的语言的反射功能,您甚至可以让对象告诉您它的类型。
这只是使用继承和工厂模式的简单情况。看看这两件事情,我想你会在你想要完成的事情上轻松上街。祝你好运,并希望它有所帮助。如果需要,我可以给你一个代码示例。 : - )
答案 2 :(得分:1)
为什么你会在第6点第二次施放物体?无论如何它将是Cat型,所以不需要这样做。是的,该字段将被设置。