java jls8_java – Lambda表达式和通用方法

假设我有一个通用接口:

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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值