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

时间:2018-05-30 15:28:35

标签: 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")
      } 
}

当我尝试运行此代码时,我得到了异常:

Caused by: java.lang.AbstractMethodError: abstract method "void org.secfirst.umbrella.data.internal.TentDao.parseFiles(java.io.File)"

如何将函数作为参数传递?我只想为每次迭代执行parseFiles(文件)。

1 个答案:

答案 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,那么你可能无法访问它。这是我的猜测。