java jls8_java - Lambda表达式和泛型方法

本文探讨了在Java中使用泛型方法和Lambda表达式时遇到的编译问题。当尝试将Lambda表达式作为非泛型接口方法的参数传递时,编译器无法正确推断类型参数,导致错误。通过分析错误消息,可以理解这是由于方法的泛型性质导致的。解决方案是使用方法引用,如`SO::compare`,或者创建一个适配的方法来解决类型推断问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设我有一个通用接口:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值