Предположим, у меня есть универсальный интерфейс:
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
Лямбда-выражение и обобщенное определение определены только в методе ⇐ JAVA
Программисты JAVA общаются здесь
1726513441
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);
Подробнее здесь: [url]https://stackoverflow.com/questions/22588518/lambda-expression-and-generic-defined-only-in-method[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия