调用java中java关键字的kotlin函数?

由于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文件。

由于您试图使用关键字,因此编译器将不允许您将其用作方法名称

我能想到的唯一解决方法是做类似的事情:

 fun new(): String { return "just returns some string" } fun notAKeyWord() = new() 

所以你可以使用Java代码中的WhatEverKt.notAKeyWord()

对于这些问题,您可以使用@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();