我这里有这个代码:
interface MyClass {
fun main() {
File(TentDatabase.getPathRepository(context)).walkBottomUp()
.filter { it.isFile }
.forEach { parseFiles(it) } //I think here is the problem
}
fun parseFiles(file: File) {
val extension = file.path.substringAfterLast('.', "")
Log.i("DB", "name - $extension")
}
}
当我尝试运行此代码时,我得到了异常:
Caused by: java.lang.AbstractMethodError: abstract method "void org.secfirst.umbrella.data.internal.TentDao.parseFiles(java.io.File)"
如何将函数作为参数传递?我只想为每次迭代执行parseFiles(文件)。
答案 0 :(得分:2)
对于你的问题:
如何将函数作为参数传递?我只想为每次迭代执行parseFiles(文件)
您可以简单地替换:
.forEach { parseFiles(it) }
使用:
.forEach(::parseFiles)
代表一个引用,您传递的函数名称可以处理forEach
将生成的参数类型。
但是,除非您将其与其他内容相关联。我认为这与你的最终字节码的版本有关。我在使用
的环境中测试了您的代码sourceCompatibility JavaVersion.VERSION_1_8
和
compileKotlin {
kotlinOptions.jvmTarget = "1.8"
}
所以在java 8中你可以访问接口上的default
方法,Kotlin默认使用这个方法,但是如果你的目标是Java 7,那么你可能无法访问它。这是我的猜测。