Por qué Kotlin funciona con los parameters pnetworkingeterminados crea un método con parámetro no utilizado

Vea este código de ejemplo en Kotlin:

fun foo(bar: Int = 0, baz: Int) { /* ... */ } 

Después de descomstackrlo en código Java (Herramientas -> Kotlin -> Mostrar Kotlin Bytecode -> Descomstackr) obtuve el siguiente código

 public static final void foo(int bar, int baz) { } // $FF: synthetic method // $FF: bridge method public static void foo$default(int var0, int var1, int var2, Object var3) { if ((var2 & 1) != 0) { var0 = 0; } foo(var0, var1); } 

Noté que el método Java resultante tiene un parámetro Object var3 sin usar.

Creo que puede estar relacionado con funciones en una class, pero al descomstackr este código

 class Foo { fun foo(bar: Int = 0, baz: Int) { /* ... */ } } 

Tengo este código

 public final class Foo { public final void foo(int bar, int baz) { } // $FF: synthetic method // $FF: bridge method public static void foo$default(Foo var0, int var1, int var2, int var3, Object var4) { if ((var3 & 1) != 0) { var1 = 0; } var0.foo(var1, var2); } } 

Como puede ver, el parámetro Object aún no se utiliza y se queda allí. Después de las testings adicionales noté el mismo comportamiento para los methods de extensión. Lo mismo ocurre cuando el parámetro pnetworkingeterminado es el último (es decir, fun foo(bar: Int, baz: Int = 0) {} )

También hice una testing básica para verificar a qué se le asigna ese valor cuando llamo a esa function usando el siguiente código

 fun main(args: Array<String>) { foo(baz = 2) } 

Y

 class Something { init { foo(baz = 2) } } 

Después de descomstackrlo obtuve el siguiente código

 public static final void main(@NotNull String[] args) { Intrinsics.checkParameterIsNotNull(args, "args"); foo$default(0, 2, 1, (Object)null); } 

Y

 public final class Something { public Something() { FooKt.foo$default(0, 2, 1, (Object)null); } } 

Lo cual tiene aún less sentido en absoluto.

Mi pregunta es: ¿Por qué Kotlin genera un parámetro no utilizado para funciones con parameters pnetworkingeterminados? ¿Es un error?

De acuerdo con esto , actualmente no está en uso, pero está reservado para agregar super llamadas con valores pnetworkingeterminados más adelante.

Puedes verlo en acción aqui:

 open class Foo { open fun foo(bar: Int = 0, baz: Int) { /* ... */ } } class Blah: Foo() { override fun foo(bar: Int, baz: Int) { } } 

que generará un Foo bytecode-to-Java de:

 public class Foo { public void foo(int bar, int baz) { } // $FF: synthetic method // $FF: bridge method public static void foo$default(Foo var0, int var1, int var2, int var3, Object var4) { if(var4 != null) { throw new UnsupportedOperationException("Super calls with default arguments not supported in this target, function: foo"); } else { if((var3 & 1) != 0) { var1 = 0; } var0.foo(var1, var2); } } } 
  • Kotlin: ¿es posible tener una propiedad constante dependiente de un tipo genérico de implementación?
  • Constructor en Kotlin
  • Obteniendo datos de local y remoto simultáneamente usando RxJava
  • ¿Puedo pasar información de tipo para simplificar esto de alguna manera?
  • kotlin: algunos problemas con arreglos en annotations
  • Kotlin sintético en adaptador o ViewHolder
  • Kotlin: ¿Cómo verificar si enum contiene una cadena dada sin interferir con las excepciones?
  • Conversión de numbers grandes a Byte en Kotlin
  • Android Studio 3 no puede build mi proyecto
  • JOOQ con Gradle y Kotlin no generan files
  • Error de la database de la sala Android: parámetro no utilizado: días en la function @Query