假设我有一个通用接口:
interface MyComparable> {
public int compare(T obj1, T obj2);
}
和一种方法排序:
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));
这将工作正常。
但现在如果我使接口非泛型,并且方法generic:
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表达式显示错误:
“Target method is generic”
OK,当我使用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
从这个错误消息,似乎编译器不能推断类型参数。是这样的情况吗?如果是,那为什么会这样发生?
我尝试了各种方式,通过互联网搜索。然后我发现this JavaCodeGeeks article,这显示一种方式,所以我试过:
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);