método Kotlin sobrecarga

Sergei Rybalkin:

Esta declaración siguiente es legal en Kotlin.

fun foo(): String = "foo_1"
fun <T> foo(): T = "foo_2" as T

Como el código de bytes que estamos consiguiendo:

public final static foo()Ljava/lang/String;

// signature <T:Ljava/lang/Object;>()TT;
// declaration: T foo<T>()
public final static foo()Ljava/lang/Object;

También es posible llamar a estos dos métodos de Kotlin.

El problema viene cuando estoy tratando de llamar a cualquiera de ellos de Java:

ClassKt.foo()

llamada ambigua. Ambos métodos se ajustan a ...

¿Cómo evitar un problema de este tipo? ¿Cómo lidiar con tales métodos? ¿Qué pasa si la biblioteca kt partido 3-rd tiene mismo problema?

El ejemplo anterior es una sintética.

Eugene:

¿Por qué funciona con Kotlin, para empezar ... En Java tiene dos métodos como:

private static String test() {
    return "";
}

private static <T> T test() {
    return null;
}

daría lugar a un error de tiempo de compilación. Y proyectos de desarrollo para Java esto es una especie de obvio, estos métodos tendrían el mismo tipo de borrado. Pero esta es la regla impuesta por javac, no por los JVMdonde se ejecuta este código. Así que javacno trata de dos métodos que tienen solamente un tipo de retorno diferentes como sobrecargas. Bueno, kotlines un idioma diferente y ya que se ejecuta en el JVM(que espere válido el código de bytes) que permite el tratamiento de métodos con solamente el tipo de retorno son diferentes como sobrecargas. Todavía tengo que mirar el código de bytes y entender cómo sucede esto; también parece que esto va a funcionar sólo para código genérico, por lo que puede ser el tipo de borrado es ligeramente diferente en caso de Kotlin.

Ahora, las cosas deben ser obvio por qué llamar a un procedimiento de este tipo de Java falla. Kotlin ofrece una buena solución para esto: @JvmName("someDistinctName"). No estoy del todo seguro de cómo funciona esta bajo el capó ya sea ... todavía, aunque supongo que esto creará un método puente.

EDITAR

@JvmName cambiará el nombre del método a nivel de byte-código.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=167509&siteId=1
Recomendado
Clasificación