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); } } } 
  • ¿Puede la class de datos Kotlin tener más de un constructor?
  • RxJava salida diferente entre Flowable y Observable con window y Groupby
  • ¿Las coroutines de kotlin tienen llamada asincrónica con timer?
  • Tipo Lambda con un número desconocido de arguments
  • Crash daga cuando construyes el proyecto
  • Compruebe nulo en la function de map en Kotlin
  • Usar un Flux en lugar de un bucle for, ¿algún beneficio?
  • Cómo get la llamada de la function kotlin
  • ¿Por qué puedo definir una var sin una class en Kotlin?
  • ¿Por qué no puedo decir: val list = properties.map ((key, valor) -> "$ key = $ value")
  • While loop en el lenguaje de progtwigción Kotlin