¿Por qué el código de byte de Kotlin hace reference a java.util.function.BiConsumer?

Por lo que entiendo, Kotlin debería poder ejecutar usando JRE 6. Pero este código con un foreach en un map falla debido a una reference a una class Java 8 ( java/util/function/BiConsumer )

CompilerTest.kt:

 fun main(args: Array<String>) { val aMap = mapOf("bar" to "bat") aMap.forEach { k, v -> println("$k -> $v")} } 

Comstack el código de Kotlin:

 » kotlinc CompilerTest.kt -jvm-target 1.6 -include-runtime -d compilerTest.jar 

Probando el código comstackdo en JRE 6:

 » docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp openjdk:6-jdk-slim java -jar compilerTest.jar Exception in thread "main" java.lang.NoClassDefFoundError: java/util/function/BiConsumer at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:643) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:277) at java.net.URLClassLoader.access$000(URLClassLoader.java:73) at java.net.URLClassLoader$1.run(URLClassLoader.java:212) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:205) at java.lang.ClassLoader.loadClass(ClassLoader.java:323) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) at java.lang.ClassLoader.loadClass(ClassLoader.java:268) at CompilerTestKt.main(CompilerTest.kt:5) Caused by: java.lang.ClassNotFoundException: java.util.function.BiConsumer at java.net.URLClassLoader$1.run(URLClassLoader.java:217) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:205) at java.lang.ClassLoader.loadClass(ClassLoader.java:323) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) at java.lang.ClassLoader.loadClass(ClassLoader.java:268) ... 12 more 

Información de versión:

 » kotlinc -version info: kotlinc-jvm 1.1.4-3 (JRE 1.8.0_131-b11) 

Resulta que el map de Kotlin henetworkinga de java.util.Map. Cuando llamas aMap.forEach { k, v -> println("$k -> $v")} , llamas a la versión Java del método.

Sin embargo, si cambia el código para tomar una input: aMap.forEach { entry -> println("$entry.key -> $entry.value")} , está llamando a la versión de Kotlin y el código se ejecutará en JRE6.

Puede marcar la dependencia en el JRE comstackndo con el indicador -no-jdk al comstackdor.

 » kotlinc CompilerTest.kt -no-jdk -jvm-target 1.6 -include-runtime -d compilerTest.jar CompilerTest.kt:5:10: error: type inference failed: inline fun <K, V> Map<out K, V>.forEach(action: (Map.Entry<K, V>) -> Unit): Unit cannot be applied to receiver: Map<String, String> arguments: ((Map.Entry<String, String>, ???) -> Unit) aMap.forEach { k, v -> println("$k -> $v")} ^ ... 

kotlinc-jvm 1.1.4-3 (JRE 1.8.0_131-b11)

Parece que estás usando la versión JDK 8. Si está utilizando gradle, debería verificar su build.gradle .

 compile "org.jetbrains.kotlin:kotlin-stdlib" // JDK 6 compile "org.jetbrains.kotlin:kotlin-stdlib-jre7" // JDK 7 compile "org.jetbrains.kotlin:kotlin-stdlib-jre8" // JDK 8 
  • Tipo de valor de par universal para extras de bash
  • ¿Por qué Android Studio convierte algunos types primitivos de Kotlin como operador condicional / seguro?
  • Excepción fatal cuando no está conectado a Internet
  • ¿Kotlin 'rem' como reemploop de 'mod' no está disponible?
  • El layout SwitchPreference no es correcto hasta que se toca
  • Retrofit2 Añadir cadena adicional al object Body
  • ¿Cómo get un KClin KClass de una cadena de nombre de class de package?
  • ¿Cómo puedo usar RetroFit2 responseBodyConverter en Kotlin?
  • cómo usar kapt en Android
  • ¿Funciones de extensión Kotlin contra funciones miembro?
  • JUnit5 testings parametrizadas a nivel de class