gpt4 book ai didi

具有类对象的 Java 泛型

转载 作者:行者123 更新时间:2023-12-02 03:03:24 26 4
gpt4 key购买 nike

我有三个类 Dog.javaCat.javaMonkey.java 都实现接口(interface) Animal.java.然后我有 DogManager.javaCatManager.javaMonkeyManager.java 每个都有以下方法并分别返回 Dog、Cat、Monkey 实例:

public Animal getAnimal(); 

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

public Animal getAnimal(String name);

这一切都工作正常,直到我必须使用工厂类返回的 Animal 对象到我的 Controller 类,我希望在其中调用公开的 bark() 方法当我从工厂获取 Dog 实例时,通过 Dog.java 执行,但我没有可用的方法,因为我的工厂返回没有 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 接受 Class 而 manager.getClassName() 返回 Class。

知道如何才能完成这项工作吗?

最佳答案

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

让我们看一个例子:

Dog dog = new Dog();
Animal animal = dog;

现在,您不能直接在动物实例中使用 bark() 方法(animal.bark() 是不可能的)。

但是,如果您使用类型转换“(Dog)动物”,则您将拥有可用于类型转换对象的所有 Dog 方法。

if(animal instanceof Dog){
((Dog) animal).bark();
}

关于具有类对象的 Java 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42113642/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com