为了账号安全,请及时绑定邮箱和手机立即绑定

Lambda表达式和通用方法

Lambda表达式和通用方法

萧十郎 2019-11-13 13:43:03
假设我有一个通用接口:interface MyComparable<T extends Comparable<T>>  {    public int compare(T obj1, T obj2);}和方法sort:public static <T extends Comparable<T>>        void sort(List<T> list, MyComparable<T> comp) {    // sort the list}我可以调用此方法并将lambda表达式作为参数传递:List<String> list = Arrays.asList("a", "b", "c");sort(list, (a, b) -> a.compareTo(b));那会很好的。但是现在,如果我将接口设为非泛型,并且将方法设为泛型:interface MyComparable {    public <T extends Comparable<T>> int compare(T obj1, T obj2);}public static <T extends Comparable<T>>        void sort(List<T> list, MyComparable comp) {}然后像这样调用:List<String> list = Arrays.asList("a", "b", "c");sort(list, (a, b) -> a.compareTo(b));它不会编译。它在lambda表达式中显示错误:“目标方法是通用的”好的,当我使用编译时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,T#2)int in interface MyComparable is generic)  where T#1,T#2 are type-variables:    T#1 extends Comparable<T#1> declared in method <T#1>sort(List<T#1>,MyComparable)    T#2 extends Comparable<T#2> declared in method <T#2>compare(T#2,T#2)1 error从该错误消息看来,编译器似乎无法推断类型参数。是这样吗 如果是,那为什么会这样呢?我尝试了各种方法,通过互联网进行了搜索。然后,我找到了这篇JavaCodeGeeks文章,它显示了一种方法,因此我尝试了:sort(list, <T extends Comparable<T>>(a, b) -> a.compareTo(b));再次无效,与该文章声称有效的相反。它可能曾经在某些初始版本中起作用。所以我的问题是:有没有办法为通用方法创建lambda表达式?我可以通过创建方法使用方法参考来做到这一点:public static <T extends Comparable<T>> int compare(T obj1, T obj2) {    return obj1.compareTo(obj2);}在某堂课中说SO,并将其作为:sort(list, SO::compare);
查看完整描述

3 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

不能使用一个lambda表达式用于功能接口,如果在该方法的功能接口具有类型参数。参见JLS8中的§15.27.3:


如果T是功能接口类型(第9.8节),并且该表达式与[..] T的功能类型一致,则Lambda表达式与目标类型T兼容。[..] Lambda表达式是一致的如果满足以下所有条件,则使用函数类型:


函数类型没有类型参数。

[..]


查看完整回答
反对 回复 2019-11-13
?
冉冉说

TA贡献1877条经验 获得超1个赞

使用方法引用,我发现了另一种传递参数的方法:


List<String> list = Arrays.asList("a", "b", "c");        

sort(list, Comparable::<String>compareTo);


查看完整回答
反对 回复 2019-11-13
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

只需指向编译器的通用比较器的正确版本即可 (Comparator<String>)


所以答案将是


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


查看完整回答
反对 回复 2019-11-13
  • 3 回答
  • 0 关注
  • 401 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信