Kotlin如何将val作为java类中的关键字

Bal*_*u M 2 java kotlin

在Kotlin中,他们引入了一个关键字val,它可以与Java互操作(我们可以从Java访问函数和成员,反之亦然).

在Java中,没有关键字val,如果我的代码在Java中看起来像这样

class Myclass{
    int val =10; //here val is variable name 
}
Run Code Online (Sandbox Code Playgroud)

如果我将这个传递给Kotlin课程,它是如何进行的?

juz*_*aai 5

根据文档,如果您的Java标识符是Kotlin中的关键字,如果您将它包装在反引号中,您仍然可以在Kotlin中使用它.

例如,如果你在Java中有这个:

public class JavaClass {
    public static int val = 3;
}
Run Code Online (Sandbox Code Playgroud)

您可以通过这种方式访问​​Kotlin:

fun main(args: Array<String>) {
    println(JavaClass.`val`) // prints 3
}
Run Code Online (Sandbox Code Playgroud)

编辑(v2):

那么从kotlin逆转到java这里java是严格类型的lang,它如何考虑kotlin val关键字

如果您的Kotlin标识符是Java关键字,那么您可能会遇到问题.

对于方法,@JvmName("other-name") 可以在Kotlin中使用注释来覆盖方法名称.

科特林:

class KotlinClass {
    @JvmName("otherName")
    fun new() {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

Java的:

public static void main(String[] args) {
    KotlinClass.otherName();
}
Run Code Online (Sandbox Code Playgroud)

但对于字段,AFAIK没有Kotlin或Java提供的解决方案.

最好不要在程序中使用Kotlin关键字,也不要使用Java关键字.


编辑(v1):(误解了第二个问题,并总体上写了如何在Java中使用Kotlin字段)

Kotlin属性将被视为Java中的getter和setter方法.声明的属性val只有一个getter.如果添加@JvmField到Kotlin属性,则可以直接访问该字段.(val将是最终的,如预期的那样).

科特林:

class KotlinClass {
    val a = 1
    var b = 2
    @JvmField val c = 3
    @JvmField var d = 4
}
Run Code Online (Sandbox Code Playgroud)

Java的:

public static void main(String[] args) {
    KotlinClass o = new KotlinClass();
    o.getA(); // 1
    // o.setA(1); // not exists
    o.getB(); // 2
    o.setB(1);
    o.c; // 3
    o.getC(); // 3
    // o.c = 1; // compile error
    // o.setC(1); // not exists
    o.d; // 4
    o.getD(); // 4
    o.d; = 4
    o.setD(1);
}
Run Code Online (Sandbox Code Playgroud)

  • @JvmName("neww")fun new():String {return"只返回一些字符串"} String s = something.neww(); 最后我得到的是最好避免kotlin关键字作为java标识符,反之亦然@Bakavali,@ Juzraai (2认同)