with method kotlin kotlin-interop

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();