method - ¿Llamando funciones de kotlin que son palabras clave en java desde java?
object kotlin java (3)
Como está intentando usar una palabra clave, el compilador no le permitirá usarla como nombre de método
La única solución que puedo pensar es hacer algo como:
fun new(): String {
return "just returns some string"
}
fun notAKeyWord() = new()
Así que puedes usar WhatEverKt.notAKeyWord()
desde tu código java
Como new
no es una palabra clave en kotlin, puedo tener la siguiente función en kotlin.
fun new(): String {
return "just returns some string"
}
Pero no puedo llamar a esta función desde java ya que new
es una palabra clave en java. Me gustaría saber si hay algún alias para esta función en el dominio java. No encontré ninguna sugerencia inteligente que pudiera ser un posible alias para esta función.
Edición 1 :
He escrito el siguiente código en kotlin:
fun new(): String {
return "just returns some string"
}
fun main(args:Array<String>){
new()
}
Y eché un vistazo al código de bytes de Java. Fue como sigue.
// ================MainKt.class =================
// class version 50.0 (50)
// access flags 0x31
public final class MainKt {
// access flags 0x19
public final static new()Ljava/lang/String;
@Lorg/jetbrains/annotations/NotNull;() // invisible
L0
LINENUMBER 2 L0
LDC "just returns some string"
ARETURN
L1
MAXSTACK = 1
MAXLOCALS = 0
// access flags 0x19
public final static main([Ljava/lang/String;)V
@Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0
L0
ALOAD 0
LDC "args"
INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull (Ljava/lang/Object;Ljava/lang/String;)V
L1
LINENUMBER 6 L1
INVOKESTATIC MainKt.new ()Ljava/lang/String;
POP
L2
LINENUMBER 7 L2
RETURN
L3
LOCALVARIABLE args [Ljava/lang/String; L0 L3 0
MAXSTACK = 2
MAXLOCALS = 1
@Lkotlin/Metadata;(mv={1, 1, 6}, bv={1, 0, 1}, k=2, d1={"/u0000/u0014/n/u0000/n/u0002/u0010/u0002/n/u0000/n/u0002/u0010/u0011/n/u0002/u0010/u000e/n/u0002/u0008/u0003/u001a/u0019/u0010/u0000/u001a/u00020/u00012/u000c/u0010/u0002/u001a/u0008/u0012/u0004/u0012/u00020/u00040/u0003/u00a2/u0006/u0002/u0010/u0005/u001a/u0006/u0010/u0006/u001a/u00020/u0004/u00a8/u0006/u0007"}, d2={"main", "", "args", "", "", "([Ljava/lang/String;)V", "new", "production sources for module Srinivas"})
// compiled from: Main.kt
}
// ================META-INF/production sources for module Srinivas.kotlin_module =================
MainKt
Y aquí está el código de bytes descompilado a java:
import kotlin.Metadata;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;
@Metadata(
mv = {1, 1, 6},
bv = {1, 0, 1},
k = 2,
d1 = {"/u0000/u0014/n/u0000/n/u0002/u0010/u0002/n/u0000/n/u0002/u0010/u0011/n/u0002/u0010/u000e/n/u0002/b/u0003/u001a/u0019/u0010/u0000/u001a/u00020/u00012/f/u0010/u0002/u001a/b/u0012/u0004/u0012/u00020/u00040/u0003¢/u0006/u0002/u0010/u0005/u001a/u0006/u0010/u0006/u001a/u00020/u0004¨/u0006/u0007"},
d2 = {"main", "", "args", "", "", "([Ljava/lang/String;)V", "new", "production sources for module Srinivas"}
)
public final class MainKt {
@NotNull
public static final String new() {
return "just returns some string";
}
public static final void main(@NotNull String[] args) {
Intrinsics.checkParameterIsNotNull(args, "args");
new();
}
}
Parece que escribir una función llamada nueva es un bytecode java válido. Pero javac
no me deja compilar el código. ¿Hay alguna anotación o indicador de compilador que pueda habilitar para que javac
compile el archivo java con una llamada a esta función?
Para este tipo de problemas, puede utilizar la anotación @JvmName
.
@JvmName("neww")
fun new(): String {
return "just returns some string"
}
El nombre que le pase será el nombre que puede usar para referirse al método de Java:
String s = something.neww();
En general, es mejor que no utilices palabras clave de Java como identificadores de Kotlin si necesitas interoperar con el código de Java.
Puede usar @JvmName
para proporcionar un nombre diferente para que su función se llame Java:
@JvmName("myNew")
fun new(): String {
return "just returns some string"
}
Y el uso en Java:
String bar = foo.myNew();