ссылка на метод экземпляра. не найдено подходящего метода для

Я знакомлюсь с новыми функциями 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))

Объясните, пожалуйста, что я не так?


person gstackoverflow    schedule 21.12.2014    source источник


Ответы (2)


InstanceMethodClass::testStr имеет 3 аргумента — два аргумента метода — String str1,String str2 и экземпляр InstanceMethodClass, для которого он вызывается.

Arrays.sort ожидает Comparator<String>, для которого требуется метод с двумя строковыми аргументами.

Ваш InstanceMethodClass::testStr не совпадает. Если вы измените testStr на статический, вы избавитесь от аргумента InstanceMethodClass, и он должен работать.

person Eran    schedule 21.12.2014
comment
Есть ли способ использовать метод экземпляра testStr и ссылку на метод? - person gstackoverflow; 21.12.2014
comment
@gstackoverflow Если для Arrays.sort требуется аргумент, тип которого является функциональным интерфейсом с методом, сигнатура которого Integer methodName (InstanceMethodClass a ,String b, String c), ваш экземпляр testStr будет соответствовать. - person Eran; 21.12.2014

Это рабочий вариант:

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