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种类型:KindExampleReferencetoastaticmethodContainingClass::staticMethodNameReferencetoaninstancemethodofaparticularobjectcontainingObject::instanceMethodNameReferencetoaninstancemethodofanarbitraryobjectofaparticulartypeContainingType::methodNameReferencetoaconstructorClassName::new注意第一种和第三种在书写形式上是一样的表格摘自methodreferences
摇曳的蔷薇
TA贡献1793条经验 获得超6个赞
Function表示接受参数Integer且返回String的方法。 所以是下面两个重载的问题:publicstaticStringtoString(inti);publicStringtoString();而你只实验了两个static方法,一个有参数Integer,一个没有,编译器是能分别出来的。如果你把f2定义中的static也会报错的。
添加回答
举报
0/150
提交
取消