美文网首页
kotlin--与Java互操作

kotlin--与Java互操作

作者: aruba | 来源:发表于2021-08-26 14:18 被阅读0次

    对于以前的Java老项目,想要使用kotlin,全部转换带来的成本代价太大了,而官方也提供了慢慢过渡到kotlin的方法,使得Java和kotlin可以互通

    一、互操作性和可空性

    1.Java中所有的对象都可能为空

    操作Java对象时,我们有必要加上判空符
    Java:

    public class MyClass {
        public String value;
        
        public String getCanNullValue(){
            return value;
        }
    }
    

    kotlin:

    fun main() {
        val my = MyClass()
        val value =  my.getCanNullValue()
        println(value?.capitalize()) 
    }
    
    2.类型映射

    代码运行时,所有的映射类型都会重新映射成原来的Java类型

    fun main() {
        val my = MyClass()
        my.value = "a123"
        val value =  my.getCanNullValue()
        println(value.javaClass) 
    }
    

    结果:
    class java.lang.String

    二、属性、异常互操作

    1.属性访问

    我们可以直接使用 "= " 对Java属性进行赋值了,对于受保护的属性,Java类需要实现对应的get、set方法
    Java:

    public class MyClass {
        private String value;
        
        public String getCanNullValue(){
            return value;
        }
    
        public void setValue(String value) {
            this.value = value;
        }
    
        public String getValue() {
            return value;
        }
    }
    

    kotlin:

    fun main() {
        val my = MyClass()
        my.value = "a123"
    }
    
    2.@JvmName

    kotlin顶层函数,在Java中都被当作静态方法
    kotlin:

    package com.aruba.mykotlinapplication.jtok
    
    fun getKotlinMessage(): String {
        return "hello, i'm kotlin"
    }
    

    Java:

    package com.aruba.mykotlinapplication.jtok;
    
    public static void main(String[] args) {
        System.out.println(JtokKt.getKotlinMessage());
    }
    

    如果你不满意kotlin在Java中的类名,可以使用@JvmName修改它
    kotlin:

    @file:JvmName("MyKotlin")
    
    package com.aruba.mykotlinapplication.jtok
    
    fun getKotlinMessage(): String {
        return "hello, i'm kotlin"
    }
    

    这样在Java中就可以用MyKotlin调用getKotlinMessage函数了

    3.@JvmField

    在Java中不能直接访问kotlin类的属性,必须调用get方法,如果想要直接使用可以在kotlin的属性上面加上@JvmField注解

    class JavaToKotlin {
        @JvmField
        val info = "Hello"
    }
    
    4.@JvmOverloads

    kotlin函数中可以给入参默认值,然后调用的时候不必传入,Java不行,如果想要Java调用时,也支持,使用@JvmOverloads注解,它会帮助kotlin产生函数的重载版本
    kotlin:

    @JvmOverloads
    fun prinltInfo(name: String, age: Int = 1) {
        println("$name $age")
    }
    

    Java:

        public static void main(String[] args) {
            MyKotlin.prinltInfo("jack");
            MyKotlin.prinltInfo("jack", 20);
        }
    
    5.@JvmStatic

    @JvmField注解还能使Java用来以静态方式获取伴生对象的属性
    @JvmStatic则允许Java直接调用伴生对象的函数

    class JavaToKotlin {
        @JvmField
        val info = "Hello"
    
        companion object {
            @JvmField
            val max: Int = 200
    
            @JvmStatic
            fun loadConfig(): String {
                return "loading config"
            }
        }
    }
    
    6.@Throws

    Java和kotlin存在异常处理的差异,使用@Throws,可以让Java知道如何处理异常
    kotlin:

    @Throws(IOException::class)
    fun throwException() {
        throw IOException()
    }
    

    kotlin中调用Java可能会出现异常的方法,则可以直接使用try catch

    三、函数类型

    Java中没有函数类型,所以,在Java里,kotlin函数类型使用FunctionN这样的名字的接口来表示,N代表入参的个数,一共有24个这样的接口,从Function0到Function23,每个接口都包含一个invoke函数,调用匿名函数需要调用invoke
    kotlin:

    val funcp: (String) -> String = {
        it.capitalize()
    }
    

    Java:

        public static void main(String[] args) {
            Function1 funcp = MyKotlin.getFuncp();
            System.out.println(funcp.invoke("abc"));
        }
    

    相关文章

      网友评论

          本文标题:kotlin--与Java互操作

          本文链接:https://www.haomeiwen.com/subject/dafuiltx.html