我这里有这个代码:
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")
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试运行此代码时,出现异常:
Caused by: java.lang.AbstractMethodError: abstract method "void org.secfirst.umbrella.data.internal.TentDao.parseFiles(java.io.File)"
Run Code Online (Sandbox Code Playgroud)
如何将函数作为参数传递?我只想为每次迭代执行 parseFiles(file) 。
对于你的问题:
如何将函数作为参数传递?我只想为每次迭代执行 parseFiles(file)
您可以简单地替换:
.forEach { parseFiles(it) }
Run Code Online (Sandbox Code Playgroud)
和:
.forEach(::parseFiles)
Run Code Online (Sandbox Code Playgroud)
它代表一个引用,您正在传递可以处理将产生的参数类型的函数的名称forEach。
但你得到的例外与其他事情有关。我认为这与你最终字节码的版本有关。我使用以下环境在环境中测试了您的代码
sourceCompatibility JavaVersion.VERSION_1_8
Run Code Online (Sandbox Code Playgroud)
和
compileKotlin {
kotlinOptions.jvmTarget = "1.8"
}
Run Code Online (Sandbox Code Playgroud)
因此,在 java 8 中,您可以访问default接口上的方法,Kotlin 默认情况下具有此功能,但如果您的目标是 Java 7,则可能无法访问此功能。这是我的猜测。