Kotlin传递函数作为参数报类型不匹配与重载解析歧义错误
问题原因
你遇到的编译错误由四个独立问题共同导致:
- lambda内函数引用语法使用错误
- 存在两个同名、参数类型来自不同包的
onImageProcessingFinished方法,编译器无法推断选择哪个重载 - 接口实现方法错误添加了
private修饰符,导致接口实现失效 - 后续修改时误将回调参数类型写为
String,和ScreenshotSaver实际返回的结果类型不匹配
修复方案
按以下步骤逐一修改即可:
- 修正接口方法的可见性
IImageListeners接口定义的onImageProcessingFinished是公开方法,你在实现时加了private修饰符,会导致编译器不认为这是接口的实现方法,删掉private修饰符即可:
override fun onImageProcessingFinished(ipr: ImageProcessingResult) { val uris = ArrayList<Uri?>() for (file in ipr.screenShotFiles) { val uri = FileProvider.getUriForFile(this, "$packageName.GenericFileProvider", file) if (uri != null) uris.add(uri) } AWDrawerMenu.listener = this AWDrawerMenu.activity = WeakReference(this) AWDrawerMenu.shareFile(uris, "image/jpg") }
- 解决重载歧义
你当前类里有两个同名的onImageProcessingFinished,分别接收两个不同包下的ImageProcessingResult参数,编译器无法自动选择。两种处理方式选其一:
- 将其中一个非接口实现的重名方法改名为其他不冲突的名称
- 调用时显式指定参数的全限定类名,明确告知编译器你要使用的类型
- 修正回调的lambda写法
你之前写的this::onImageProcessingFinished(ipr)是错误语法:::是函数引用操作符,使用函数引用时不需要手动加括号传参;如果要在lambda内直接调用方法,不需要加::。
两种正确写法二选一:
- 写法1(lambda内直接调用,最不容易出错,记得写对参数类型,不要误写为String):
override fun onShareThisApp(arrayBitmap: ArrayList<Bitmap?>?) { val appSettings = instance!! val outputPath = appSettings.outputPathCache val taskRunner = TaskRunner() taskRunner.executeAsync( ScreenshotSaver(arrayBitmap, outputPath!!, "") ) { ipr: com.xxx.xxx.activities.thought.result.ImageProcessingResult -> onImageProcessingFinished(ipr) } }
- 写法2(直接传函数引用,前提是已经解决了重载歧义,方法签名和回调要求完全匹配):
override fun onShareThisApp(arrayBitmap: ArrayList<Bitmap?>?) { val appSettings = instance!! val outputPath = appSettings.outputPathCache val taskRunner = TaskRunner() taskRunner.executeAsync( ScreenshotSaver(arrayBitmap, outputPath!!, ""), this::onImageProcessingFinished ) }
注意:
ScreenshotSaver作为Callable实现类,返回的结果类型是ImageProcessingResult,不要把回调参数类型写成String,否则会报类型不匹配错误。
内容的提问来源于stack exchange,提问作者Diego Perez
相关产品推荐
相关产品推荐

