Java中type作为参数_在Java方法引用中使用type参数

本文探讨了Java10中局部变量类型推断的使用,特别是与方法引用结合的情况。作者通过示例展示了如何利用方法引用创建局部变量,并解释了在类型推断过程中遇到的问题和解决方案。文章还提到了类型参数和功能接口在这一过程中的作用,以及编译器如何处理这些信息。最终,作者总结了如何正确地应用类型推断和方法引用以避免编译错误。
摘要由CSDN通过智能技术生成

我认为Java 10的局部变量类型推断(var name = …;)将是这个难题的答案.右侧需要完全指定类型,而不是提供方法引用类型的目标变量类型,而需要在方法引用上使用类型参数(::< T>).

首先想到了大门……

var arraySorter = Arrays::sort;

…但方法引用本身并不定义类型.它们需要由编译器转换为功能对象,并且编译器不会搜索寻找适当类型的已知功能接口,即使只有一个.

接下来的想法是使用方法引用作为方法的参数,该方法基于方法的参数返回类型.

class Spy {

static Function f2(Function f) {

return f.andThen(f);

}

static T identity(T t) {

return t;

}

}

使用这个,我们可以创建我们的局部变量,将方法引用传递给我们的方法:

Function double_identity = f2(Spy::identity);

正如所料,我们可以删除::< Double>

Function double_identity = f2(Spy::identity);

出乎意料的是,局部变量类型推断很好.

var double_identity = f2(Spy::identity); // Infers !

Object obj = null;

double_identity.apply(obj);

但是当使用方法引用类型来覆盖它时,真正的惊喜就出现了.

var double_identity = f2(Spy::identity); // Error: Double != Object

经过一番战斗,我弄明白了为什么.我们必须将类型应用于f2方法本身:

var double_identity = Spy.f2(Spy::identity); // Works.

回想起来,这是有道理的.变量的类型通常为外部函数提供上下文.将结果分配给函数< Double,Double>变量让编译器推断f2(…)的类型,然后将该类型传递给参数.使用var name = …,没有显式类型,唯一可用的类型是Object,因此编译器会推断Spy.< Object> f2(…),然后确定参数类型必须是Function标识不会导致函数被推断为Spy.< Double> f2(…)并且变量为功能

但是,它确实结束了我滥用var name = …的企图;解决OP的难题.

非常感谢@Eugene批评我之前在Java 10发布之前的尝试.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值