前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >kotlin--与Java互操作

kotlin--与Java互操作

作者头像
aruba
发布2021-12-06 17:20:19
5110
发布2021-12-06 17:20:19
举报
文章被收录于专栏:android技术
对于以前的Java老项目,想要使用kotlin,全部转换带来的成本代价太大了,而官方也提供了慢慢过渡到kotlin的方法,使得Java和kotlin可以互通
一、互操作性和可空性
1.Java中所有的对象都可能为空

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

代码语言:javascript
复制
public class MyClass {
    public String value;
    
    public String getCanNullValue(){
        return value;
    }
}

kotlin:

代码语言:javascript
复制
fun main() {
    val my = MyClass()
    val value =  my.getCanNullValue()
    println(value?.capitalize()) 
}
2.类型映射

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
fun main() {
    val my = MyClass()
    my.value = "a123"
}
2.@JvmName

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

代码语言:javascript
复制
package com.aruba.mykotlinapplication.jtok

fun getKotlinMessage(): String {
    return "hello, i'm kotlin"
}

Java:

代码语言:javascript
复制
package com.aruba.mykotlinapplication.jtok;

public static void main(String[] args) {
    System.out.println(JtokKt.getKotlinMessage());
}

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

代码语言:javascript
复制
@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注解

代码语言:javascript
复制
class JavaToKotlin {
    @JvmField
    val info = "Hello"
}
4.@JvmOverloads

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

代码语言:javascript
复制
@JvmOverloads
fun prinltInfo(name: String, age: Int = 1) {
    println("$name $age")
}

Java:

代码语言:javascript
复制
    public static void main(String[] args) {
        MyKotlin.prinltInfo("jack");
        MyKotlin.prinltInfo("jack", 20);
    }
5.@JvmStatic

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
@Throws(IOException::class)
fun throwException() {
    throw IOException()
}

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

三、函数类型

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

代码语言:javascript
复制
val funcp: (String) -> String = {
    it.capitalize()
}

Java:

代码语言:javascript
复制
    public static void main(String[] args) {
        Function1 funcp = MyKotlin.getFuncp();
        System.out.println(funcp.invoke("abc"));
    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/8/26 下,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 对于以前的Java老项目,想要使用kotlin,全部转换带来的成本代价太大了,而官方也提供了慢慢过渡到kotlin的方法,使得Java和kotlin可以互通
  • 一、互操作性和可空性
    • 1.Java中所有的对象都可能为空
      • 2.类型映射
      • 二、属性、异常互操作
        • 1.属性访问
          • 2.@JvmName
            • 3.@JvmField
              • 4.@JvmOverloads
                • 5.@JvmStatic
                  • 6.@Throws
                  • 三、函数类型
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档