Java:从多个方法中创建通用方法

标签 java generics

我遇到了一段代码,其中两个方法具有非常相似的功能,返回相同的类型,但不同。

private Set<String> extractDeviceInfo(List<Device> devices){
        Set<String> sets= new HashSet<>();
        for(Device item:items){
            sets.add(item.getDeviceName());
        }
        return sets;
    }

private Set<String> extractDeviceInfoFromCustomer(List<Customer> customers){
    Set<String> sets= new HashSet<>();
        for (Customer c : customers) {
                sets.add(c.getDeviceName());
            }
        return sets;
}

从上面的代码中可以看出,这两种方法都返回相同的 Set 并检索相同的数据。

我试图尝试从中创建一个通用方法,并做了一些研究,但找不到任何可以解决此问题的方法。 如果我理解正确的话,使用泛型,我可以在方法中定义泛型参数,然后在调用方法时传递参数以及类类型。但是我不知道之后该怎么办。 例如,方法 getDeviceName() 我如何从泛型类中调用它,因为编译器不知道泛型类是否具有该方法。

如果有人能告诉我这是否可行以及如何实现预期结果,我将非常感激。

谢谢

更新:创建一个接口(interface)然后进行实现看起来是一个很好的解决方案,但我觉得在重构一些方法以避免样板时它做得太过了。 我注意到通用类可以作为参数传递,并且具有诸如 getMethod() 等方法。 我想知道是否可以创建一个通用方法,在其中传递类和方法名称,然后该方法在运行时解析该方法

例如。

private <T> Set<String> genericMethod(Class<T> clazz, String methodName ){
    clazz.resolveMethod(methodName);
}

所以基本上,我可以在调用方法时执行此操作:

genericMethod(Customer.class,"gedDeviceInfo");

我相信有一种语言可以实现这一点,但不确定是否可以在 Java 中实现,不过,几年前我记得读过有关将字符串解析为 java 代码以便它们在运行时进行编译的内容。

最佳答案

DeviceCustomer 都应实现定义方法 getDeviceName 的相同接口(interface):

interface Marker {
    String getDeviceName();
}
class Device implements Marker { ... }
class Customer implements Marker { ... }

我将其命名为Marker,但您可以合理地命名它。然后,该方法可能如下所示:

private Set<String> extractDeviceInfo(List<? extends Marker> markers) {
    return markers.stream().map(Marker::getDeviceName).collect(Collectors.toSet());
}

它允许以下类型变化:

extractDeviceInfo(new ArrayList<Device>());
extractDeviceInfo(new ArrayList<Customer>());
extractDeviceInfo(new ArrayList<Marker>());

关于Java:从多个方法中创建通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49278292/

相关文章:

java - 无法从 JSP 访问 WEB-INF 下定义的 CSS 文件

java - 桌面应用程序中的布局

c# - 泛型的乐趣 : no implicit reference conversion error

r - 将 R S3 普通函数转换为泛型函数

Swift:泛型类中的声明

java - 如何在 Android Studio 中创建 Java 类而不是 C++ 类?

java - Collections.shuffle 无法按 SimClock 随机值的预期工作

java - 如何在 Kotlin 中手动为 long 分配字节?

java - 我可以在java中添加两个泛型值吗?

generics - Dart:有限制地扩展了通用类