gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:45:14 25 4
gpt4 key购买 nike

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

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 应该实现相同的接口(interface),其中定义了方法 getDeviceName:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com