考虑这个例子(OOP 书籍中的典型例子):
我有一个 Animal
类,其中每个 Animal
可以有很多 friend 。
以及像 Dog
、Duck
、Mouse
等添加特定行为的子类,如 bark()
、quack ()
等
这是 Animal
类:
public class Animal {
private Map<String,Animal> friends = new HashMap<>();
public void addFriend(String name, Animal animal){
friends.put(name,animal);
}
public Animal callFriend(String name){
return friends.get(name);
}
}
这里有一些包含大量类型转换的代码片段:
Mouse jerry = new Mouse();
jerry.addFriend("spike", new Dog());
jerry.addFriend("quacker", new Duck());
((Dog) jerry.callFriend("spike")).bark();
((Duck) jerry.callFriend("quacker")).quack();
有什么方法可以使用泛型作为返回类型来摆脱类型转换,所以我可以说
jerry.callFriend("spike").bark();
jerry.callFriend("quacker").quack();
这里有一些初始代码,其返回类型作为从未使用过的参数传递给方法。
public<T extends Animal> T callFriend(String name, T unusedTypeObj){
return (T)friends.get(name);
}
有没有办法在运行时使用 instanceof
确定返回类型而不需要额外的参数?或者至少通过传递该类型的类而不是虚拟实例。
我知道泛型用于编译时类型检查,但有解决方法吗?
最佳答案
你可以这样定义callFriend
:
public <T extends Animal> T callFriend(String name, Class<T> type) {
return type.cast(friends.get(name));
}
然后这样调用它:
jerry.callFriend("spike", Dog.class).bark();
jerry.callFriend("quacker", Duck.class).quack();
此代码的好处是不会生成任何编译器警告。当然,这实际上只是从前通用时代开始的更新版本,并没有增加任何额外的安全性。
关于java - 如何使方法返回类型通用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/450807/