如何使方法返回类型为泛型?考虑一下这个例子(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?或者至少传递一个类型的类,而不是一个虚拟实例。我知道泛型是用于编译时类型检查的,但是有解决办法吗?
3 回答
富国沪深
TA贡献1790条经验 获得超9个赞
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();
ABOUTYOU
TA贡献1812条经验 获得超5个赞
jerry.callFriend("spike")
jerry.addFriend("quaker", new Duck());jerry.callFriend("quaker", /* unused */ new Dog()); // dies with illegal cast
talk()
Mouse jerry = new Mouse();jerry.addFriend("spike", new Dog());jerry.addFriend("quacker", new Duck()); jerry.callFriend("spike").talk();jerry.callFriend("quacker").talk();
素胚勾勒不出你
TA贡献1827条经验 获得超9个赞
@SuppressWarnings("unchecked")public <T extends Animal> T callFriend(String name) { return (T)friends.get(name);}
@SuppressWarnings
ClassCastExceptions
jerry.<Dog>callFriend("spike").bark();
Animal
talk()
添加回答
举报
0/150
提交
取消