Вызов функций kotlin, которые являются ключевыми словами в java из java?
С new
не является ключевым словом в Котлине, я могу иметь следующую функцию в Котлине.
fun new(): String {
return "just returns some string"
}
но я не могу вызвать эту функцию из Java с new
является ключевым словом в java. Я хотел бы знать, есть ли какой-то псевдоним для этой функции в Java realm. Я не нашел никаких предложений intellij, которые могли бы быть возможным псевдонимом для этой функции.
изменить 1:
я написал следующий код в Котлин:
fun new(): String {
return "just returns some string"
}
fun main(args:Array<String>){
new()
}
и я посмотрел на байт-код Java. Он был следующим образом.
// ================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={"u0000u0014nu0000nu0002u0010u0002nu0000nu0002u0010u0011nu0002u0010u000enu0002u0008u0003u001au0019u0010u0000u001au00020u00012u000cu0010u0002u001au0008u0012u0004u0012u00020u00040u0003u00a2u0006u0002u0010u0005u001au0006u0010u0006u001au00020u0004u00a8u0006u0007"}, 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
и вот байт-код, декомпилированный на 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 = {"u0000u0014nu0000nu0002u0010u0002nu0000nu0002u0010u0011nu0002u0010u000enu0002bu0003u001au0019u0010u0000u001au00020u00012fu0010u0002u001abu0012u0004u0012u00020u00040u0003¢u0006u0002u0010u0005u001au0006u0010u0006u001au00020u0004¨u0006u0007"},
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();
}
}
похоже, что запись функции с именем new является допустимым байт-кодом java. Но!--6--> не позволяет мне скомпилировать код. Есть ли какая-то аннотация или флаг компилятора, который я могу включить, чтобы получить javac
для компиляции файла java с вызовом этой функции.
3 ответов
поскольку вы пытаетесь использовать ключевое слово, компилятор не позволит вам использовать его в качестве имени метода
единственное решение, которое я могу придумать, это сделать что-то вроде:
fun new(): String {
return "just returns some string"
}
fun notAKeyWord() = new()
Так что вы можете использовать WhatEverKt.notAKeyWord()
из вашего кода java
для таких проблем вы можете использовать @JvmName
Примечание.
@JvmName("neww")
fun new(): String {
return "just returns some string"
}
имя, которое вы передаете ему, будет именем, которое вы можете использовать для ссылки на метод из Java:
String s = something.neww();
В общем, вам, вероятно, лучше не использовать ключевые слова Java в качестве идентификаторов Kotlin, если вам нужно взаимодействовать с кодом Java.
можно использовать @JvmName
чтобы предоставить другое имя для вашей функции, которая будет называться form Java:
@JvmName("myNew")
fun new(): String {
return "just returns some string"
}
и использование в Java:
String bar = foo.myNew();