从 java 调用 java 中的关键字的 kotlin 函数?
Calling kotlin functions which are keywords in java from java?
由于new
不是kotlin中的关键字,我可以在kotlin中有以下功能。
fun new(): String {
return "just returns some string"
}
但我无法从 java 调用此函数,因为 new
是 java 中的关键字。我想知道 java 领域中是否有此函数的别名。我没有找到任何可能是此函数别名的 intellij 建议。
编辑 1:
我用kotlin写了下面的代码:
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={"\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
这里是反编译为 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();
}
}
看起来编写名为 new 的函数是有效的 java 字节码。但是 javac
不允许我编译代码。是否有一些注释或编译器标志我可以启用以获取 javac
以通过调用此函数编译 java 文件。
对于这类问题,您可以使用 @JvmName
注释。
@JvmName("neww")
fun new(): String {
return "just returns some string"
}
您传递给它的名称将是您可以用来引用来自 Java:
的方法的名称
String s = something.neww();
一般来说,如果您需要与 Java 代码互操作,最好不要使用 Java 关键字作为 Kotlin 标识符。
您可以使用 @JvmName
为要调用的函数提供不同的名称 Java:
@JvmName("myNew")
fun new(): String {
return "just returns some string"
}
以及Java中的用法:
String bar = foo.myNew();
由于您尝试使用关键字,编译器不允许您将其用作方法名
我能想到的唯一解决方法是:
fun new(): String {
return "just returns some string"
}
fun notAKeyWord() = new()
因此您可以使用 java 代码中的 WhatEverKt.notAKeyWord()
由于new
不是kotlin中的关键字,我可以在kotlin中有以下功能。
fun new(): String {
return "just returns some string"
}
但我无法从 java 调用此函数,因为 new
是 java 中的关键字。我想知道 java 领域中是否有此函数的别名。我没有找到任何可能是此函数别名的 intellij 建议。
编辑 1:
我用kotlin写了下面的代码:
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={"\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
这里是反编译为 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();
}
}
看起来编写名为 new 的函数是有效的 java 字节码。但是 javac
不允许我编译代码。是否有一些注释或编译器标志我可以启用以获取 javac
以通过调用此函数编译 java 文件。
对于这类问题,您可以使用 @JvmName
注释。
@JvmName("neww")
fun new(): String {
return "just returns some string"
}
您传递给它的名称将是您可以用来引用来自 Java:
的方法的名称String s = something.neww();
一般来说,如果您需要与 Java 代码互操作,最好不要使用 Java 关键字作为 Kotlin 标识符。
您可以使用 @JvmName
为要调用的函数提供不同的名称 Java:
@JvmName("myNew")
fun new(): String {
return "just returns some string"
}
以及Java中的用法:
String bar = foo.myNew();
由于您尝试使用关键字,编译器不允许您将其用作方法名
我能想到的唯一解决方法是:
fun new(): String {
return "just returns some string"
}
fun notAKeyWord() = new()
因此您可以使用 java 代码中的 WhatEverKt.notAKeyWord()