Подтвердить что ты не робот

Вызов функций kotlin, которые являются ключевыми словами в java из java?

Так как new не является ключевым словом в kotlin, я могу иметь следующую функцию в kotlin.

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

Но я не могу вызывать эту функцию из java, поскольку new - это ключевое слово в java. Я хотел бы знать, есть ли какой-либо псевдоним для этой функции в java-сфере. Я не нашел никаких интуитивных предложений, которые могли бы быть возможным псевдонимом для этой функции.

Изменить 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={"\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 файла с вызовом этой функции.

4b9b3361

Ответ 1

Поскольку вы пытаетесь использовать ключевое слово, компилятор не позволит вам использовать его как имя метода

Единственное обходное решение, которое я могу сделать, это сделать что-то вроде:

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

fun notAKeyWord() = new()

Итак, вы можете использовать WhatEverKt.notAKeyWord() из своего java-кода

Ответ 2

Для такого рода проблем вы можете использовать аннотацию @JvmName.

@JvmName("neww")
fun new(): String {
    return "just returns some string"
}

Имя, которое вы передадите ему, будет именем, которое вы можете использовать для ссылки на метод из Java:

String s = something.neww();

В общем, вам, вероятно, лучше не использовать ключевые слова Java как идентификаторы Kotlin, если вам нужно взаимодействовать с Java-кодом.

Ответ 3

Вы можете использовать @JvmName, чтобы указать другое имя для вашей функции, называемой формой Java:

@JvmName("myNew")
fun new(): String {
    return "just returns some string"
}

И использование в Java:

String bar = foo.myNew();