假设我有一个通用接口:
interface MyComparable> {
public int compare(T obj1, T obj2);
}
方法SO:
public static >
void sort(List list, MyComparable comp) {
// sort the list
}
我可以调用此方法并将lambda表达式作为参数传递:
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));
它不编译。 它显示lambda表达式的错误说:
“目标方法是通用的”
好的,当我使用SO编译它时,它显示以下错误:
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));
这也是行不通的,与那篇文章声称它有效相反。 可能它曾经在一些初始构建中工作。
所以我的问题是:有没有办法为泛型方法创建lambda表达式? 我可以通过创建方法使用方法引用来做到这一点:
public static > int compare(T obj1, T obj2) {
return obj1.compareTo(obj2);
}
在某些课程中说SO,并将其传递为:
sort(list, SO::compare);