【Kotlin 初学者】Java和Kotlin互操作

2023-05-16

作者简介:CSDN博客专家、华为云·云享专家认证

系列专栏:Kotlin 初学者

五星好评:左侧点一下(网页端),移动端:https://bbs.csdn.net/topics/603956616

目录

一、Kotlin调用Java

1.1 互操作性与可空性

1.2 类型映射

1.3 属性访问

二、Java调用Kotlin

2.1 @JvmName

2.2 @JvmField

2.3 @JvmStatic

2.4 @JvmOverloads

2.4.1 未使用@JvmOverloads注解

2.4.2 使用@JvmOverloads注解

2.5 @Throws

2.6 函数类型操作


一、Kotlin调用Java

1.1 互操作性与可空性

        Java世界里所有对象都是null,当一个Kotlin函数返回String类型值,它是可空的。

建立一个 Java 类

class JavaUser {
    public String userInfo(){
        return "Java-帅次";
    }
    //返回null
    public String family(){
        return null;
    }
}

Kotlin 调用 Java 方法

fun main() {
    var user = JavaUser()
    println(user.userInfo())//
    //使用时报错:NullPointerException
//    println(user.family().length)

    //平台类型,可能为null
    var fam = user.family()
    //当fam为null时,fam?.length返回null
    println(fam?.length)//null
}

1.2 类型映射

        代码运行时,所有的映射类型都会重新映射回对应的Java类型。

Java定义属性类型

class JavaUser {
    public String name = "Java";
    ...
}

Kotlin 查看类型

fun main() {
    println(user.name.javaClass)//查看类型:class java.lang.String
}

1.3 属性访问

        刚才使用public修饰属性,在Kotlin可以直接调用,那么我们用private呢?

Java定义属性

class JavaUser {
    private int age =18;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    ...
}

Kotlin 使用

fun main() {
    println(user.age)
    user.age = 12
    println(user.age)
    println(user.age.javaClass)
}

        如果仅使用private而不设置get/set方法 Kotlin是无法调用的,当设置了get/set方法。Kotlin可以直接调用其属性,而不用调用get/set方法(默认调用get/set方法),如下图:

二、Java调用Kotlin

2.1 @JvmName

        可以使用JvmName注解指定编译类的名字。

2.1.1 在KotlinUser文件中定义kotlinUserInfo()函数

package com.scc.kotlin.primary.jandk

fun kotlinUserInfo() = "来自Kotlin的招呼"

2.1.2 在JavaMain使用main方法调用Kotlin的kotlinUserInfo()函数

package com.scc.kotlin.primary.jandk;

class JavaMain {
    public static void main(String[] args) {
        System.out.println(KotlinUserKt.kotlinUserInfo());//来自Kotlin的招呼
    }
}

        觉得KotlinUserKt不好看,咱们给它换个名字,或者说起个别名。

2.1.3 在Kotlin文件最上方添加@JvmName

        这个必须写在文件最顶部。

@file:JvmName("SCKotlin")
package com.scc.kotlin.primary.jandk
fun kotlinUserInfo() = "来自Kotlin的招呼"

2.1.4 调用@JvmName设置的名字

    public static void main(String[] args) {
//        System.out.println(KotlinUserKt.kotlinUserInfo());//来自Kotlin的招呼
        System.out.println(SCKotlin.kotlinUserInfo());//来自Kotlin的招呼
    }

2.2 @JvmField

        在Java里,不能直接访问Kotlin定义的字段(如下:name),所以必须调用getName,然而,你可以给Kotlin属性添加@JvmField注解,暴露它的支持字段给Java调用者,从而避免使用getter方法。

class KotlinSc{
    @JvmField
    var name = "Kotlin-SC"
    var age = 13
}

        KotlinSc的name属性添加了@JvmField注解,Java可以直接调用,age属性未添加@JvmField注解,所以Java无法直接调用,当然你可以通过get/set方法调用age属性。如下图:

class JavaMain {
    public static void main(String[] args) {
        KotlinSc kotlinSc=new KotlinSc();
        System.out.println(kotlinSc.name);//Kotlin-SC
    }
}

2.3 @JvmStatic

        对函数使用该注解,kotlin编译器将生成另一个静态方法;

        对属性使用该注解,kotlin编译器将生成其他的setter和getter方法;

        这个注解的作用其实就是消除Java调用Kotlin的companion object对象时不能直接调用其静态方法和属性的问题.

注意:此注解只能在companion object中使用

class KotlinSc {
    ...
    //伴生对象
    companion object{
        var height = 178
        fun evaluate() = "SC是一个学习Kotlin的小渣渣"
    }
}

在kotlin中可直接使用,但是在Java中则必须

//在kotlin中可直接使用
fun main() {
    println(KotlinSc.height.toString().plus("CM"))//178CM
    println(KotlinSc.evaluate())//SC是一个学习Kotlin的小渣渣
}
//在Java中则相对复杂一些。
    public static void main(String[] args) {
        KotlinSc kotlinSc=new KotlinSc();
        System.out.println(kotlinSc.Companion.getHeight()+"CM");//178CM
        System.out.println(kotlinSc.Companion.evaluate());//SC是一个学习Kotlin的小渣渣

    }

给伴生对象的函数使用@JvmStatic注解,属性还是使用

class KotlinSc {
    ...
    companion object{
        @JvmField
        var height = 178
        @JvmStatic
        fun evaluate() = "SC是一个学习Kotlin的小渣渣"
    }
}

Java调用添加注解的函数和属性

    public static void main(String[] args) {
        KotlinSc kotlinSc=new KotlinSc();
        System.out.println(KotlinSc.height+"CM");//178CM
        System.out.println(KotlinSc.evaluate());//SC是一个学习Kotlin的小渣渣

    }

2.4 @JvmOverloads

        JvmOverloads注解协助产生Kotlin函数的重载版本。设计一个可能会暴露给Java用户使用的API时,记得使用@JvmOverloads注解,这样,无论你是Kotlin开发者还是Java开发者,都会对这个API的可靠性感到满意。

2.4.1 未使用@JvmOverloads注解

        定义一个未使用@JvmOverloads注解的Kotlin函数

fun kotlinEat(bread: String = "巧克力面包", meat: String = "鸡翅") {
    println("$bread-搭配-$meat-美极了")
}

        使用kotlin调用,一点问题没有,妥妥的。

fun main() {
    kotlinEat();//巧克力面包-搭配-鸡翅-美极了
    kotlinEat("橙香面包")//橙香面包-搭配-鸡翅-美极了
    kotlinEat(meat = "羊肉")//巧克力面包-搭配-羊肉-美极了
    kotlinEat("奶油长杆面包","牛肉")//奶油长杆面包-搭配-牛肉-美极了
}

        使用Java调用,仅能调用传入两个参数的方法,而不能像Kotlin那样随意调用。

2.4.2 使用@JvmOverloads注解

        我们在给kotlinEat(bread: String = "巧克力面包", meat: String = "鸡翅")函数添加@JvmOverloads注解。

@JvmOverloads
fun kotlinEat(bread: String = "巧克力面包", meat: String = "鸡翅") {
    println("$bread-搭配-$meat-美极了")
}

    public static void main(String[] args) {
        SCKotlin.kotlinEat("Java牌面包");//Java牌面包-搭配-鸡翅-美极了

    }

        为什么会这样?咱们看看:

        未使用@JvmOverloads注解

        使用@JvmOverloads注解,此处截图不全,两个参数的方法没截取到,感兴趣的自己去玩玩。

        使用@JvmOverloads注解后强迫该函数重载,这样Java就可以进行不同场景调用了。

2.5 @Throws

        使用@Throws注解,声明这个方法要检查Exception。

//这里的Throws是必须添加的,要不Java那边无法捕捉这个异常
@Throws(IOException::class)
fun kotlinEatException(){
    println("吃东西呛住了")
    throw IOException()
}

        编译成Java代码,如下:

    public static void main(String[] args) {
        try {
            SCKotlin.kotlinEatException();//吃东西呛住了
        } catch (IOException e) {
            System.out.println(e);//java.io.IOException
            e.printStackTrace();
        }
    }

2.6 函数类型操作

        函数类型和匿名函数能提供高效的语法用于组件间的交互,是Kotlin编程语言里比较新颖的特性。

        他们简洁的语法因->操作符而实现,但Java8之前的JDK版本并并不支持lambda表达式。

        在Java里,Kotlin函数类型使用FunctionN这样的名字的接口来表示的,FunctionN中的N代表值参数目。这样的Function接口从Function0到Function22(23个),每一个FunctionN都包含一个invoke函数,专用于调用函数类型函数,所以,任何时候需要调一个函数类型,都用它调用invoke。

val hair = {colorHair:String ->
    println( "头发染成 $colorHair 即可")
}

val hairTwo = {colorHair:String,lengthHair:Int ->
    println( "头发染成$colorHair,剪至$lengthHair-厘米即可")
}
        Function1<String, Unit> hair = SCKotlin.getHair();
        hair.invoke("红色");//头发染成 红色 即可
        Function2<String, Integer, Unit> hairTwo = SCKotlin.getHairTwo();
        hairTwo.invoke("蓝色",8);//头发染成蓝色,剪至8-厘米即可

Function接口从Function0到Function22(23个)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Kotlin 初学者】Java和Kotlin互操作 的相关文章

  • 通过http接口进行批量post操作(json格式)

    通过 64 Test或者main方法来进行 相关依赖 poi lt dependency gt lt groupId gt org apache poi lt groupId gt lt artifactId gt poi lt artif
  • spring容器初始化bean后执行方法

    有时 xff0c 我们需要在启动bean时初始化bean属性 xff0c 例如读取perporties文件 xff0c 对属性进行赋值 xff1b 启动容器时让某个method方法执行等等 这时需要在进行配置 xff0c 让bean在注入时
  • 4个简单有效的网页视频下载方法,超级简单好用

    有很多网站的视频是没有下载功能的 xff0c 想要下载视频怎么办呢 xff1f 今天就分享给大家4个简单有效的网页视频下载方法 xff0c 多个平台都适用 xff0c 而且操作简单 xff0c 一看就会 xff01 一 审查元素下载 一个简
  • iptables详解

    5链 INPUT OUTPUT PREROUTING FORWARD POSTROUTING INPUT OUTPUT gt PREROUTING gt 是否为本机 gt FORWARD gt POSTROUTING gt 其他主机 所以
  • 浅谈一致性哈希算法 consistent hashing

    接触过分布式的小伙伴一定对一致性哈希算法这个词语不陌生 xff0c 那么到底什么是一致性哈希算法呢 xff1f 了解一致性哈希算法之前我们先了解下哈希取模 假设我们有三台服务器 xff0c 缓存3万张图片 当然我们可以均匀的分配到每个服务器
  • ubuntu20.04启用SSH

    新安装的ubuntu20 04默认是没有开启ssh的 xff0c 所以无法使用ssh登录系统 1 安装openssh server span class token function sudo span span class token f
  • 密码生成器

    import random def Range get num alist listout 61 while num gt 0 listout append alist random randint 0 len alist 1 num 61
  • centos7安装oracle中遇到的常见问题解决方法

    1 安装图形界面 yum y install gnome 2 安装vnc server yum y install vnc server vncpasswd 设置密码 vncserver启动vnc windows安装vnc客户端客户端 通过
  • java中keytool生成的jks证书转换为openssl格式证书

    一 通常jks文件包含了服务器的私钥 server key xff0c 服务器证书 server crt 根证书 ca crt 二 通过java的keytool工具导出成 PKCS12 格式文件 my p12 keytool importk
  • IBMX3650M4安装win2008Server操作指南

    IBMX3650M4安装win2008Server操作指南 由于IBM服务器是IBM原有的Linux系统 xff0c 所以需要在此硬件上安装Win 2008 Server系统 xff08 以下简称win8 xff09 xff0c 中间遇到了
  • windows远程桌面连接到服务器黑屏问题

    任务管理器使用组合键 Ctrl 43 Alt 43 End xff0c 于是打开了远程电脑的任务管理器 xff0c 取消 xff0c 即可返回桌面正常显示
  • p2p数据分析

    大数据在许多国家具有战略意义 xff0c 其原因不仅在少数巨头公司的应用 xff0c 而是大 中 小 微企业乃至个人 xff0c 都能利用大数据来创造新的价值 而互联网本身就是一个大数据的金矿 xff0c 利用它创造价值 xff0c 是时代
  • 关于The GPG keys listed for the "***" repository are already installed but they are not corret

    这个问题是在自己制作的repo源码库的时候出现的 xff0c 从字面上理解 xff0c 是 为 源码仓库出示的GPG密钥已经安装 xff0c 但不正确 首先 xff0c GPG密钥存在的目的是处于安全和规范考虑 xff0c RedHat在发
  • __stack_chk_fail问题分析

    一 问题 进程收到SIGABRT 信号异常退出 xff0c 异常调用栈显示 stack chk fail Build fingerprint 39 Pico A7H10 PICOA7H10 10 5 5 0 smartcm 16769120
  • 十套精美个人博客网站模板

    文件资源 点击下载 展示在下方 xff0c 点击你想下载的文件 xff0c 然后点击普通下载就能下载了 紫色的图片博客个人页面模板 红色的微博社交平台HTML模板 响应式生活博客设计网站HTML5模板 程序员个人博客模板 响应式的互联网IT
  • 高性能无锁环形队列 Disruptor

    Disruptor 环形队列 JLog 秒级百G级日志搜集 传输 存储解决方案 高性能无锁队列 Disruptor 高性能队列 Disruptor 使用教程 高性能队列Disruptor框架的详细说明与实战使用 SpringBoot 并发框
  • ubuntu20.04更换阿里的软件源

    新安装的ubuntu20 04的软件源是使用的国外的源 xff0c 因此在使用apt安装软件时速度并不怎么快 xff0c 建议大家更换为国内的源 xff0c 这样在使用apt安装软件时速度会有明显的提升的 ubuntu20 04 apt的配
  • mpi运行窗口无反应或者闪退

    原因有三 1 xff0c 服务未启动 2 xff0c 系统防火墙拦截
  • Newtonsoft.Json使用,C# Json文件读取,写入

    用学校作为例子 xff0c 有学校名称 xff0c 学校下面有班级 xff0c 班级有名字 xff0c 班级下面有学生 xff0c 这里面有数组 xff0c 有字段 using System using System Collections
  • Motrix全能下载工具使用

    Motrix是一款界面简约 功能丰富 专业可靠的全能下载工具 先下载 CSDN下载 Motrix zip下载 官方下载地址 Motrix 打开Motrix xff0c 将种子文件放到这里 开始下载

随机推荐

  • ActiveMQ-JMS(五):ObjectMessage的安全问题

    安全问题 按照apache官网的说明 xff0c 为了避免收到恶意代码 xff0c 引入了安全机制 xff0c 只允许指定的包里的对象能够被传输 原文如下 xff1a ObjectMessage objects depend on Java
  • 剑指offer 03

    span class token keyword class span span class token class name Solution span span class token punctuation span span cla
  • 「得印度者,得天下」聊聊你不知道的印度在线视频江湖

    印度 xff0c 一个神奇古老的国度 千百年来 xff0c 恒河水鉴证了古印度王朝的兴衰更迭 xff0c 壮丽的历史文化 xff0c 和印度文明缘起缘灭的生死轮回 时光飞转 xff0c 来到公元 2018年 恒河水波澜不惊一切如昨 xff0
  • Trinity简介(1)--用于无参考基因组的转录组de novo组装

    一 Trinity简介 Trinity xff0c 是由 the Broad Institute 开发的转录组de novo组装软件 xff0c 由三个独立的软件模块组成 xff1a Inchworm Chrysalis和Butterfly
  • Trinity进行转录组组装(2))

    1 Trinity进行转录组组装 Trinity进行转录组组装的典型命令如下 opt biosoft trinityrnaseq r20131110 Trinity pl seqType fq JM 50G left sample1 1 c
  • python的两种退出方式

    os exit vs sys exit 转自 xff1a http www cnblogs com gaott archive 2013 04 12 3016355 html 概述 python的程序有两种退出方式 xff1a os exi
  • R语言数据类型转化

    R语言数据类型转化 转自 xff1a http www wangluqing com 2014 09 10 r share34 有时候 xff0c 对于一些问题 xff0c 需要进行数据类型之间的转换 R提供了基本类型转换函数以解决数据类型
  • ubuntu20.04安装中文输入法

    虽然搜狗的官网已经宣传说已经支持2004 2010 xff0c 但是支持的并不完美 xff0c 闪退 xff0c 打不出字各种问题不断 xff0c 所以本文带领大家安装几款能够正常使用的中文输入法 但是正在我要发这篇博客的时候 xff0c
  • R语言做柱状图

    R语言做柱状图 转自 xff1a http www phperz com article 16 0102 180120 html 条形图代表在与条成比例的变量的值的长度矩形条数据 R使用函数barplot 来创建柱状图 R能够绘制柱状图垂直
  • R语言 PCA(主成分分析)

    R语言 PCA 转自 xff1a http www cnblogs com longzhongren p 4300593 html 1 关键点 综述 xff1a 主成分分析 因子分析 典型相关分析 xff0c 三种方法的共同点主要是用来对数
  • 使用Pandas对数据进行筛选和排序

    使用Pandas对数据进行筛选和排序 转自 xff1a http bluewhale cc 2016 08 06 use pandas filter and sort html 筛选和排序是Excel中使用频率最多的功能 xff0c 通过这
  • linux 下安装blat软件

    linux 下安装blat软件 blat是一款很经典的比对工具 xff0c 与blast相比 xff0c 具有速度快 共线性输出比对结果等优点 但是 xff0c blat源码包里面的README文件写得很不清楚 xff0c 这里 xff0c
  • 基于统计的压缩算法:游程编码

    原网址 xff1a http www cnblogs com xudong bupt p 3761417 html 基于统计的压缩算法 xff1a 游程编码 1 游程编码概念 游程编码又称 运行长度编码 或 行程编码 xff0c 是一种统计
  • BWT (Burrows–Wheeler_transform)数据转换算法

    原网址 xff1a https blog csdn net luanzheng 365 article details 78575429 BWT Burrows Wheeler transform 数据转换算法 1 什么是BWT 压缩技术主
  • pip使用豆瓣的镜像源

    抄自 xff1a https www cnblogs com ZhangRuoXu p 6370107 html pip使用豆瓣的镜像源 豆瓣镜像地址 xff1a https pypi douban com simple 虽然用easy i
  • PyVCF

    抄自 xff1a https www cnblogs com nkwy2012 p 9204088 html vcf文件的全称是variant call file xff0c 即突变识别文件 xff0c 它是基因组工作流程中产生的一种文件
  • 【Kotlin 初学者】扩展-享受编程

    作者简介 xff1a CSDN博客专家 华为云 云享专家认证 系列专栏 xff1a Kotlin 初学者 学习交流 xff1a 三人行必有我师焉 xff1b 择其善者而从之 xff0c 其不善者而改之 目录 一 介绍 二 扩展函数 2 1
  • 【Kotlin 初学者】函数式编程

    作者简介 xff1a CSDN博客专家 华为云 云享专家认证 系列专栏 xff1a Kotlin 初学者 五星好评 xff1a 左侧点一下 网页端 xff0c 移动端 xff1a https bbs csdn net topics 6039
  • centos8.5 更新失败

    今天使用yum makecache的时候出现了Error Failed to download metadata for repo 39 base 39 Cannot download repomd xml Cannot download
  • 【Kotlin 初学者】Java和Kotlin互操作

    作者简介 xff1a CSDN博客专家 华为云 云享专家认证 系列专栏 xff1a Kotlin 初学者 五星好评 xff1a 左侧点一下 网页端 xff0c 移动端 xff1a https bbs csdn net topics 6039