小编典典

如何使方法返回类型通用?

all

考虑这个例子(在 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?或者至少通过传递一个类型的类而不是一个虚拟实例。
我了解泛型用于编译时类型检查,但是有解决方法吗?


阅读 92

收藏
2022-03-04

共1个答案

小编典典

你可以这样定义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();

此代码的好处是不会生成任何编译器警告。当然,这实际上只是从前通用时代开始的更新版本,并没有增加任何额外的安全性。

2022-03-04