实例方法引用。找不到合适的方法

时间:2014-12-21 13:02:47

标签: java lambda java-8 method-reference

我介绍了java 8的新功能。

我有以下课程:

class InstanceMethodClass {

    Integer testStr(String str1,String str2) {
        return str1.compareTo(str2);
    }
}

并在调用之后:

 Arrays.sort(new String[]{"1", "3","2"},InstanceMethodClass::testStr );

之后我看到以下错误:

java: no suitable method found for sort(java.lang.String[],InstanceMe[...]stStr)
    method java.util.Arrays.<T>sort(T[],java.util.Comparator<? super T>) is not applicable
      (cannot infer type-variable(s) T
        (argument mismatch; invalid method reference
          cannot find symbol
            symbol:   method testStr(T,T)
            location: class lambdas.staticReferences.InstanceMethodClass))
    method java.util.Arrays.<T>sort(T[],int,int,java.util.Comparator<? super T>) is not applicable
      (cannot infer type-variable(s) T
        (actual and formal argument lists differ in length))

请解释我错了什么?

2 个答案:

答案 0 :(得分:3)

InstanceMethodClass::testStr有3个参数 - 方法的两个参数 - String str1,String str2,以及调用它的InstanceMethodClass实例。

Arrays.sort需要Comparator<String>,这需要一个带有2个String参数的方法。

您的InstanceMethodClass::testStr不匹配。如果将testStr更改为静态,则将删除InstanceMethodClass参数,它应该可以正常工作。

答案 1 :(得分:1)

这是工作变体:

Arrays.sort(new String[]{"1", "3","2"}, new InstanceMethodClass()::testStr );