引起原因:java.lang.AbstractMethodError:Kotlin 中的抽象方法

Dou*_*ita 5 android kotlin

我这里有这个代码:

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) 。

Sie*_*imo 2

对于你的问题:

如何将函数作为参数传递?我只想为每次迭代执行 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,则可能无法访问此功能。这是我的猜测。