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

标签 java generics return-value

考虑这个例子(OOP 书籍中的典型例子):

我有一个 Animal 类,其中每个 Animal 可以有很多 friend 。
以及像 DogDuckMouse 等添加特定行为的子类,如 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/

相关文章:

java - Play Framework 2.0 中的路由重载函数

c# - C# 中的泛型属性

java - 尝试反射(reflect)接受泛型类型的方法

python - 成功登录时 Paramiko 返回代码

java - 当尝试将 KeyListener 添加到我的 JFrame 时,它​​总是给我一个错误

java - 如何通过存储库部署到AEM实例?

日期 "Wednesday, January 2, 2013 5:29:26 PM +02:00"的 Java 日期格式字符串

java - 在java中获取List <int>的.class

c - 为什么我从函数调用中获得垃圾值?

c++ - 始终返回的地址为0而不是实际值