java - 在比较器中使用字符串时出错
问题描述
我正在尝试创建一个实现可比较的类。当所有类元素都是整数时,一切正常。当我使用 String 并使用comparing
而不是comparingInt
时,我收到以下错误。
Comparator 类型的泛型方法 compare(Function) 的类型参数数量不正确;它不能用参数参数化
myClass 类型未定义适用于此处的 getFrom(T)
public class myClass implements Comparable<myClass> {
@Column (name="From")
private String from;
@Column (name="To")
private String to;
@Column (name="With")
private String with;
@Column (name="amount")
private int amount;
// Setters, getters, constructor
Comparator<myClass > comp = Comparator.<myClass>comparing(myClass::getFrom)
.thenComparing(myClass::getTo)
.thenComparing(myClass::getWith)
.thenComparingInt(myClass::getAmount);
@Override
public int compareTo(myClass o) {
return comp.compare(this, o);
}
}
有人能指出我在这里可能缺少什么吗?
解决方案
Comparator::comparing是一个通用方法,它采用一个用于提取要比较的值的函数。您将方法引用传递给myClass::getFrom
返回 aString
并将在myClass
类型 object 上调用的方法(通过Function::apply
)。这就是为什么你必须传递泛型类型myClass
和String
.
但是,您可以省略这些泛型类型,因为您将比较器分配给Comparator<myClass> comp
变量,因此可以自动推断类型(也使用您使用的方法引用中的类型)。
进一步看让我们看看Comparator::comparing(Function)
方法实现:
static <T, U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T, ? extends U> var0) {
Objects.requireNonNull(var0);
return (Comparator)((Serializable)((var1x, var2x) -> {
return ((Comparable)var0.apply(var1x)).compareTo(var0.apply(var2x));
}));
}
这里T
将是myClass
并且U
将会是String
。函数var0
将myClass
作为参数并返回String
(因此方法引用myClass::getFrom
将在这里工作 - 通常它就像getFrom
在myClass
对象上调用)。实际上,正如您所看到的,此方法将返回 aComparator
作为 lambda 函数,该函数将使用函数var0
从var1x
and中提取值var2x
(它们都是myClass
类型)。对我来说,它看起来有点像一个闭包。
推荐阅读
- machine-learning - 如何在 Keras 中对系列数据进行分类?
- c# - 如何使用参数填写 WebApi2 RouteTemplate 以生成路由字符串?
- kotlin - 如何在 Kotlin 的列表中创建包含每两个项目的地图?
- mysql - 在 group by 中选择 sum with a group by
- azure-service-fabric - 可靠的字典性能语义
- javascript - 服务器发送事件有哪些好的用例
- c# - 如何使用 iCommand 在 MainWindow 中更改我的 Textblock 中的文本?
- firebase - Firebase 功能未部署,旧版本保留
- macos - 如何模拟干净的mac环境来测试.app
- java - Java问题设置serialVersionUID