首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java泛型与类对象

Java泛型与类对象
EN

Stack Overflow用户
提问于 2017-02-08 20:51:34
回答 3查看 234关注 0票数 0

我有三个类Dog.javaCat.javaMonkey.java,它们都实现了接口Animal.java。然后,我让DogManager.javaCatManager.javaMonkeyManager.java分别具有以下方法并分别返回狗、猫和猴子的实例:

代码语言:javascript
运行
复制
public Animal getAnimal(); 

最后,我有一个工厂类,它接受一个动物名称并返回一个适当的动物实例。

代码语言:javascript
运行
复制
public Animal getAnimal(String name);

这一切都运行得很好,直到我必须使用由工厂类返回的Animal对象到我的控制器类,我希望在从工厂获取狗实例时调用由Dog.java公开的bark()方法,但我没有可用的方法,因为我的工厂返回了没有bark()的Animal类型。

因此,我正在考虑尝试将一个类对象传递给工厂类中的getAnimal():

代码语言:javascript
运行
复制
public <T> T getAnimal(String name, Class<T implements Animal> clazz);    

但是,这要求我知道每个动物名称的类关联。我尝试了以下几种方法:

IManager.java

代码语言:javascript
运行
复制
Class<?> getClassName();
String getName();

DogManager.java

代码语言:javascript
运行
复制
public Class<?> getClassName(){
    return Dog.class;
}

public String getName(){
    return "Dog";
}

public Dog getName(){
    return new Dog();
}

CatManager.java

代码语言:javascript
运行
复制
Class<?> getClassName(){
    return Cat.class;
}

public String getName(){
    return "Cat";
}

然后在我的工厂调用中:

代码语言:javascript
运行
复制
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()返回类。

你知道我该怎么做吗?

EN

回答 3

Stack Overflow用户

发布于 2017-02-08 21:10:13

一旦你有了一个Animal实例,并且你知道它是一个Dog,你就可以将它转换为Dog并使用Dog类的所有方法。

让我们来看一个例子:

代码语言:javascript
运行
复制
Dog dog = new Dog();
Animal animal = dog;

但是如果您使用强制转换'( Dog ) animal',您将拥有对象的所有可用Dog方法。

代码语言:javascript
运行
复制
if(animal instanceof Dog){
    ((Dog) animal).bark();
}
票数 2
EN

Stack Overflow用户

发布于 2017-02-08 21:13:13

解决这个问题的方法是在您的方法签名中添加您想要获取的动物的类,因为当您编写factory.getAnimal(name, manager.getClassName())时,编译器无法猜测您想要获取的动物。

因此,答案是在IManager中添加一个参数化类型,这样getAnimal()方法就可以返回好的类型。但是,即使这样做,也必须在要查找的子类型中强制转换Animal,因为getAnimal()方法只能返回Animal,而不会出现任何编译错误。

您将不能拥有任何DogCat,除非在某个地方,您没有将其写在代码中

票数 0
EN

Stack Overflow用户

发布于 2017-02-08 22:11:40

这是一个糟糕的技术的一个很好的例子。考虑将其保存为“人们做坏事”的警示故事。如果你真的希望继续走这条失败的道路,那么考虑以下几点:

这些都不是好的或高质量的软件development.

  • Add方法的例子,比如“
  1. ()”到动物接口。如果实现是Dog,此方法会将Animal强制转换返回给Dog,如果不是,则返回null。也可以添加"boolean Cat ()“。在Dog类中,像这样实现isDog:return true;.
  2. In
  3. isDog,像这样实现isDog方法:
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42113642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档