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

lambda表达式简写之方法引用,引用Integer类中的toString方法为什么编译报错各位有什么建议?

lambda表达式简写之方法引用,引用Integer类中的toString方法为什么编译报错各位有什么建议?

牧羊人nacy 2019-10-16 10:13:07
lambda表达式简写之方法引用,引用Integer类中的toString方法,Function是数据转换的函数式接口.//使用lambda写没问题,可以实现Integer类型转换成String类型Functionfunction30=t->Integer.toString(t);//使用方法引用简化上面的代码,却编译报错Functionfunction3=Integer::toString;我的分析一:toString方法的参数是int类型,于是我自定义了一个f方法,如下,结果是正常引用该方法,不会报错.说明不是int类型的问题,可以自动拆箱Functionfunction2=_Lambda::f;publicstaticStringf(inti){returnInteger.toString(i);}我的分析二:toString方法有3个重载方法,于是我自定义了2个重载方法去尝试,发现也没有问题不会报错//Integer中的3个重载方法publicstaticStringtoString(inti);publicstaticStringtoString(inti,intradix);publicStringtoString()//引用f2,不会报错,可以实现类型转换,说明不是重载的问题Functionfunction23=_Lambda::f2;publicstaticStringf2(Integeri){returnInteger.toString(i);}publicstaticStringf2(){return"123";}请问,Functionfunction3=Integer::toString;问题出在了?为什么编译报错?求解答!
查看完整描述

2 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

方法引用表达式Integer::toString可以表示引用Integer类的toString静态方法
Functionf=t->Integer.toString(t)
也可以表示引用任意Integer实例的toString成员方法
Functionf=t->t.toString()
编译器无法判断应该使用哪个解释
你自己定义的类中最后一个f2由于是静态的,不会有这种冲突,所以编译可以通过你自己定义的类中没有这种冲突,所以编译可以通过
以下是两个冲突的示例
publicclassDemo{
publicstaticvoidmain(String[]args){
Functionfunction2=Demo::f2;
BiFunctionfunction3=Demo::f3;
}
publicstaticStringf2(Demoi){
return"456";
}
publicStringf2(){
return"123";
}
publicstaticStringf3(Demodemo,inti){
return"456";
}
publicStringf3(inti){
return"123";
}
}
编译报错信息如下
Error:(9,44)java:不兼容的类型:方法引用无效
对f2的引用不明确
Demo中的方法f2(Demo)和Demo中的方法f2()都匹配
Error:(10,55)java:不兼容的类型:方法引用无效
对f3的引用不明确
Demo中的方法f3(Demo,int)和Demo中的方法f3(int)都匹配
方法引用的4种类型:
Kind
Example
Referencetoastaticmethod
ContainingClass::staticMethodName
Referencetoaninstancemethodofaparticularobject
containingObject::instanceMethodName
Referencetoaninstancemethodofanarbitraryobjectofaparticulartype
ContainingType::methodName
Referencetoaconstructor
ClassName::new
注意第一种和第三种在书写形式上是一样的
表格摘自methodreferences
                            
查看完整回答
反对 回复 2019-10-16
?
摇曳的蔷薇

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

Function表示接受参数Integer且返回String的方法。
所以是下面两个重载的问题:
publicstaticStringtoString(inti);
publicStringtoString();
而你只实验了两个static方法,一个有参数Integer,一个没有,编译器是能分别出来的。如果你把f2定义中的static也会报错的。
                            
查看完整回答
反对 回复 2019-10-16
  • 2 回答
  • 0 关注
  • 266 浏览
慕课专栏
更多

添加回答

举报

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