考虑以下示例(OOP书籍中的典型示例):
我有一Animal
堂课,每个人Animal
可以有很多朋友。
和子类喜欢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
?或者至少通过传递类型的类而不是虚拟实例。
我了解泛型用于编译时类型检查,但是是否有解决方法?