Java 在比较器中使用字符串时出错
我正在尝试创建一个实现可比较的类。当所有的类元素都是整数时,一切都很好。当我使用字符串并使用Java 在比较器中使用字符串时出错,java,comparator,comparable,Java,Comparator,Comparable,我正在尝试创建一个实现可比较的类。当所有的类元素都是整数时,一切都很好。当我使用字符串并使用比较而不是比较时,我收到以下错误 类型比较器的泛型方法比较(函数)的类型参数数目不正确;不能使用参数对其进行参数化 MyClassType没有定义适用于此处的getFrom(T) 公共类myClass实现了可比较的{ @列(name=“From”) 来自的私有字符串; @列(name=“To”) 私有字符串到; @列(name=“With”) 私用字符串; @列(name=“amount”) 私人整数
比较
而不是比较
时,我收到以下错误
- 类型比较器的泛型方法比较(函数)的类型参数数目不正确;不能使用参数对其进行参数化
- MyClassType没有定义适用于此处的getFrom(T)
公共类myClass实现了可比较的{
@列(name=“From”)
来自的私有字符串;
@列(name=“To”)
私有字符串到;
@列(name=“With”)
私用字符串;
@列(name=“amount”)
私人整数金额;
//setter、getter、构造函数
Comparator comp=Comparator.comparing(myClass::getFrom)
.Then比较(myClass::getTo)
.Then比较(myClass::getWith)
.然后比较它(myClass::getAmount);
@凌驾
公共整数比较(myClass o){
返回comp.comp.compare(本,o);
}
}
有人能指出我可能遗漏了什么吗?好的,这里有几件事。首先,这里的工作代码主要是删除您提供的类型参数 您可以这样做,因为它们将被自动推断。只有当它们不可推断时(IDE会告诉您),您才需要显式地执行此操作。关于类型推断的大量信息散布在Java文档中;e、 g
import java.util.Comparator;
公共类MyClass实现了可比较的{
来自的私有字符串;
私有字符串到;
公共字符串getFrom(){return from;}
公共字符串getTo(){return to;}
Comparator comp=Comparator.comparing(MyClass::getFrom)
.然后比较(MyClass::getTo);
@凌驾
公共整数比较(MyClass o){
返回comp.comp.compare(本,o);
}
}
其他一些注释一般有帮助,或可供将来参考:
- 类名中大写的第一个字母
- 试着把你的代码精简成一个完整的/可复制的例子。例如,这使用了两个字段,这两个字段都存在并且可以粘贴到IDE中。问题1使用了4个字段,其中大多数字段不存在
myClass::getFrom
方法的方法引用,该方法返回字符串
,并将在myClass
类型对象上调用(通过Function::apply
)。这就是为什么必须传递泛型类型myClass
和String
但是,您可以操作这些泛型类型,因为您正在将比较器分配给comparator comp
变量,因此可以自动推断类型(也可以使用所使用方法引用中的类型)
进一步来看,让我们看看Comparator::comparing(函数)
方法实现:
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));
}));
}
static删除泛型类型,它应该工作,或者显式地Comparator。比较…@michalk当我显式地编写它时,它工作了。你能解释一下为什么会这样吗?
import java.util.Comparator;
public class MyClass implements Comparable<MyClass>{
private String from;
private String to;
public String getFrom() { return from; }
public String getTo() { return to; }
Comparator<MyClass> comp = Comparator.comparing(MyClass::getFrom)
.thenComparing(MyClass::getTo);
@Override
public int compareTo(MyClass o) {
return comp.compare(this, o);
}
}
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));
}));
}