Kotlin中@JvmOverloads、@JvmStatic、@JvmField、@JvmName、@JvmMultifileClass

23 篇文章 0 订阅
13 篇文章 0 订阅

1. @JvmOverloads

一句话就是为了解决Java不能重载kotlin 有默认参数的方法

比如Kotlin代码如下调用是没有问题的:

class Test {

    fun testJvm(a: String, b: Int = 1) {

    }

    fun abc() {
        testJvm("a")
        testJvm("a", 3)
    }
}

但是如果java中调用:

class TestJava {
    private void tt() {
        TestKt test = new TestKt();
        test.testJvm("3"); //这里会报错
        test.testJvm("3", 4);
    }
}

在这里插入图片描述
所以需要在Kotlin方法上添加 @JvmOverloads:
在这里插入图片描述

在这里插入图片描述
再一个是比如自定义View的构造方法中:

class CustomView @JvmOverloads constructor(
    private val context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : View(mContext, attrs, defStyleAttr) 

就相当于写了三个构造方法:

public class CustomView extends View{

    public CustomView (Context context) {
        this(context, null);
    }

    public CustomView (Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CustomView (Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

2. @JvmStatic、@JvmField

一句话就是为了解决在Java中不能直接调用kotlin 中的静态方法和静态变量

比如如下Kotlin代码:

class TestKt {
    companion object {
        val s = 5
        fun abc() {}
    }
    
    fun test(){
        TestKt.s
        TestKt.abc()
    }
}

companion object内的是静态变量,可以直接类名.调用,但是在java中调用需要这样写:

class TestJava {
    private void tt() {
        int s = TestKt.Companion.getS();
        TestKt.Companion.abc();
    }
}

如果想在java中也直接类名.调用静态变量或者方法的话需要如下写法:

class TestKt {
    companion object {
        @JvmField //修饰字段
        val s = 5
        @JvmStatic //修饰方法
        fun abc() {}
    }
}

然后java调用:

class TestJava {
    private void tt() {
        int s = TestKt.s;
        TestKt.abc();
    }
}

3. @JvmName

一句话为了解决Java调用Kotlin文件中的字段或者方法,需要在原来Kotlin文件名基础后面加Kt,加上@JvmName 就可以去掉 后面的Kt,直接文件名调用了。

比如如下Kotlin 文件:

在这里插入图片描述

//文件名:TestKotlinFile.kt
val s = 2
fun abc(){}

java中调用:

class TestJava {
    private void tt() {
        int s = TestKotlinFileKt.getS();
        TestKotlinFileKt.abc();
    }
}

@file:JvmName(“TestKotlinFile”)必须写在包名的前面,否则无法起作用

@file:JvmName("TestKotlinFile")
package com.test.squre

val s = 2
fun abc(){}

Java中调用,就可以直接使用文件名.调用了:

class TestJava {
    private void tt() {
        int s = TestKotlinFile.getS();
        TestKotlinFile.abc();
    }
}

4. @JvmMultifileClass

如果我们在同一包名下面的两个kt文件中,用@file:JvmName(“TestKotlinFile”) 注解了一样的class名字,就会报错,需要添加@JvmMultifileClass解决

在这里插入图片描述

//TestKotlinFile.kt
@file:JvmName("TestKotlinFile")
@file:JvmMultifileClass
package com.test.squre

val s = 2
fun abc(){}


//TestKotlinFile2.kt
@file:JvmName("TestKotlinFile")
@file:JvmMultifileClass

package com.test.squre

val s2 = 6
fun abc2() {}

Java中调用:

class TestJava {
    private void tt() {
        int s = TestKotlinFile.getS();
        TestKotlinFile.abc();

        int s2 = TestKotlinFile.getS2();
        TestKotlinFile.abc2();
    }
}
  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值