Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在比较器中使用字符串时出错_Java_Comparator_Comparable - Fatal编程技术网

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));
    }));
}