我遇到了一段代码,其中两个方法具有非常相似的功能,返回相同的类型,但不同。
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 代码以便它们在运行时进行编译的内容。
最佳答案
Device
和 Customer
都应实现定义方法 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/