我正在尝试创建一个在类的字段上重新返回比较器的函数,但是当我尝试获取 o2 的值时,在 Comparable v2 = (Comparable ) field.get(o2);
,表示 lambda 参数无法转换为对象。有人可以帮忙吗?
public Comparator comp(String className, String fieldName) throws Exception {
Comparator comparator = Comparator.comparing((o1, o2) -> {
Class aClass = null;
try {
aClass = Class.forName(className);
Field field = aClass.getDeclaredField(fieldName);
field.setAccessible(true);
Comparable v1 = (Comparable) field.get(o1);
Comparable v2 = (Comparable) field.get(o2);
return v1.compareTo(v2);
} catch (Exception e) {
e.printStackTrace();
}
return 0;
});
return comparator;
}
最佳答案
您正在使用 Comparator.comparing 方法,但您传入的实际上是比较器的实现。您可以摆脱该方法调用并使用:
Comparator comparator = (o1, o2) -> {
Class aClass = null;
try {
aClass = Class.forName(className);
Field field = aClass.getDeclaredField(fieldName);
field.setAccessible(true);
Comparable v1 = (Comparable) field.get(o1);
Comparable v2 = (Comparable) field.get(o2);
return v1.compareTo(v2);
} catch (Exception e) {
e.printStackTrace();
}
return 0;
};
return comparator;
<小时/>
或者,您可以继续使用 Comparator.comparing 方法,但请记住,您应该传入提取字段值的函数:
public Comparator comp(String className, String fieldName) throws Exception {
Class aClass = Class.forName(className);
Field field = aClass.getDeclaredField(fieldName);
field.setAccessible(true);
Comparator comparator = Comparator.comparing(o1 -> {
try {
Comparable v1 = (Comparable) field.get(o1);
return v1;
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
});
return comparator;
}
关于java - 尝试为给定字段上的给定类创建比较器时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60806867/