Лямбда-выражение и обобщенное определение определены только в методеJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Лямбда-выражение и обобщенное определение определены только в методе

Сообщение Anonymous »

Предположим, у меня есть универсальный интерфейс:

interface MyComparable {
public int compare(T obj1, T obj2);
}


И сортировка метода:

public static
void sort(List list, MyComparable comp) {
// sort the list
}


Я могу вызвать этот метод и передать лямбда-выражение в качестве аргумента:

List list = Arrays.asList("a", "b", "c");
sort(list, (a, b) -> a.compareTo(b));


Это будет работать нормально.

Но теперь, если я сделаю интерфейс неуниверсальным, а метод — универсальным:

interface MyComparable {
public int compare(T obj1, T obj2);
}

public static
void sort(List list, MyComparable comp) {
}


А затем вызовите это следующим образом:

List list = Arrays.asList("a", "b", "c");
sort(list, (a, b) -> a.compareTo(b));


Он не компилируется. Он показывает ошибку в лямбда-выражении:


"Целевой метод является универсальным"


Хорошо, когда я скомпилировал его с помощью javac, он показывает следующую ошибку:

SO.java:20: error: incompatible types: cannot infer type-variable(s) T#1
sort(list, (a, b) -> a.compareTo(b));
^
(argument mismatch; invalid functional descriptor for lambda expression
method (T#2,T#2)int in interface MyComparable is generic)
where T#1,T#2 are type-variables:
T#1 extends Comparable declared in method sort(List,MyComparable)
T#2 extends Comparable declared in method compare(T#2,T#2)
1 error


Из этого сообщения об ошибке видно, что компилятор не может определить аргументы типа. Так ли это? Если да, то почему так происходит?

Я пробовал разные способы, искал в интернете. Затем я нашел статью JavaCodeGeeks, в которой показан способ, и попробовал:

sort(list, (a, b) -> a.compareTo(b));


что опять же не работает, вопреки тому, что в статье утверждается, что это работает. Возможно, в некоторых первоначальных сборках это работало.

Поэтому мой вопрос: есть ли какой-нибудь способ создать лямбда-выражение для универсального метода? Я могу сделать это, используя ссылку на метод, создав метод:

public static int compare(T obj1, T obj2) {
return obj1.compareTo(obj2);
}


в каком-то классе скажите SO и передайте его как:

sort(list, SO::compare);


Подробнее здесь: https://stackoverflow.com/questions/225 ... -in-method
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»