我有三个类Dog.java、Cat.java和Monkey.java,它们都实现了接口Animal.java。然后,我让DogManager.java、CatManager.java和MonkeyManager.java分别具有以下方法并分别返回狗、猫和猴子的实例:
public Animal getAnimal(); 最后,我有一个工厂类,它接受一个动物名称并返回一个适当的动物实例。
public Animal getAnimal(String name);这一切都运行得很好,直到我必须使用由工厂类返回的Animal对象到我的控制器类,我希望在从工厂获取狗实例时调用由Dog.java公开的bark()方法,但我没有可用的方法,因为我的工厂返回了没有bark()的Animal类型。
因此,我正在考虑尝试将一个类对象传递给工厂类中的getAnimal():
public <T> T getAnimal(String name, Class<T implements Animal> clazz); 但是,这要求我知道每个动物名称的类关联。我尝试了以下几种方法:
IManager.java
Class<?> getClassName();
String getName();DogManager.java
public Class<?> getClassName(){
return Dog.class;
}
public String getName(){
return "Dog";
}
public Dog getName(){
return new Dog();
}CatManager.java
Class<?> getClassName(){
return Cat.class;
}
public String getName(){
return "Cat";
}然后在我的工厂调用中:
IManager manager = getManager(); //Here I will get one of the Cat/Dog/Monkey managers based on name
factory.getAnimal(name, manager.getClassName()); //Compilation fails here但这不起作用,因为getAnimal获取类,而manager.getClassName()返回类。
你知道我该怎么做吗?
发布于 2017-02-08 21:10:13
一旦你有了一个Animal实例,并且你知道它是一个Dog,你就可以将它转换为Dog并使用Dog类的所有方法。
让我们来看一个例子:
Dog dog = new Dog();
Animal animal = dog;但是如果您使用强制转换'( Dog ) animal',您将拥有对象的所有可用Dog方法。
if(animal instanceof Dog){
((Dog) animal).bark();
}发布于 2017-02-08 21:13:13
解决这个问题的方法是在您的方法签名中添加您想要获取的动物的类,因为当您编写factory.getAnimal(name, manager.getClassName())时,编译器无法猜测您想要获取的动物。
因此,答案是在IManager中添加一个参数化类型,这样getAnimal()方法就可以返回好的类型。但是,即使这样做,也必须在要查找的子类型中强制转换Animal,因为getAnimal()方法只能返回Animal,而不会出现任何编译错误。
您将不能拥有任何Dog或Cat,除非在某个地方,您没有将其写在代码中
发布于 2017-02-08 22:11:40
这是一个糟糕的技术的一个很好的例子。考虑将其保存为“人们做坏事”的警示故事。如果你真的希望继续走这条失败的道路,那么考虑以下几点:
这些都不是好的或高质量的软件development.
return true;.isDog,像这样实现isDog方法:https://stackoverflow.com/questions/42113642
复制相似问题