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

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;问题出在了?为什么编译报错?求解答!
牧羊人nacy
浏览 268回答 2
2回答

温温酱

方法引用表达式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

摇曳的蔷薇

Function表示接受参数Integer且返回String的方法。所以是下面两个重载的问题:publicstaticStringtoString(inti);publicStringtoString();而你只实验了两个static方法,一个有参数Integer,一个没有,编译器是能分别出来的。如果你把f2定义中的static也会报错的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript