Kotlin与Java互操作

2023-05-16

1,Kotlin 调用Java

import java.util.*

fun demo(source: List<Int>) {
    val list = ArrayList<Int>()    
    for (item in source) {
        list.add(item)
    }
    for (i in 0..source.size - 1) {
        list[i] = source[i] // get and set are called
    }
}

关于getter和setter的默认调用

import java.util.Calendar

fun calendarDemo() {
    val calendar = Calendar.getInstance()
    if (calendar.firstDayOfWeek == Calendar.SUNDAY) {  // 调用了getFirstDayOfWeek()
        calendar.firstDayOfWeek = Calendar.MONDAY      // 调用了 setFirstDayOfWeek()
    }
    if (!calendar.isLenient) {                         // 调用了isLenient()
        calendar.isLenient = true                      // 调用了setLenient()
    }
}

注意,如果一个java属性只有setter,那么Kotlin就无法访问。 Kotlin访问java的属性其实是默认调用了这个属性的getter函数

如果一个java函数是void类型的,那么kotlin调用后获得的返回值类型是Unit

如果一个java函数名用了kotlin的关键字,比如inobjectis ,那么在kotlin中访问的时候,要给函数名加上' ,

foo.`is`(bar)

2,null安全和平台类型

java中的对象很可能是null,kotlin把java对象当做平台类型,对其null安全要求不再那么苛刻

val list = ArrayList<String>() // 不需要java的new了
list.add("Item")
val size = list.size 
val item = list[0] // 普通java对象,当做平台类型
//当我们调用平台类型的变量时, Kotlin不会在编译阶段就做null安全性检查, 但运行的时候可能会访问失败
item.substring(1) // 编译通过,运行的时候如果item是null就会抛出exception 
val nullable: String? = item // 正确
val notNull: String = item // 编译通过,但运行时可能报错

我们不能在代码中显式声明平台类型,为了方便编译阶段检查,我们设定以下记忆符号:

  • T! 意思是 "T 或T?",

  • (Mutable)Collection<T>! 意思是 "Java collection of T may be mutable or not, may be nullable or not",

  • Array<(out) T>! 意思是"Java array of T (or a subtype of T), nullable or not"


3,类型对应关系

Java typeKotlin type
bytekotlin.Byte
shortkotlin.Short
intkotlin.Int
longkotlin.Long
charkotlin.Char
floatkotlin.Float
doublekotlin.Double
booleankotlin.Boolean

 


Java typeKotlin type
java.lang.Objectkotlin.Any!
java.lang.Cloneablekotlin.Cloneable!
java.lang.Comparablekotlin.Comparable!
java.lang.Enumkotlin.Enum!
java.lang.Annotationkotlin.Annotation!
java.lang.Deprecatedkotlin.Deprecated!
java.lang.CharSequencekotlin.CharSequence!
java.lang.Stringkotlin.String!
java.lang.Numberkotlin.Number!
java.lang.Throwablekotlin.Throwable!

 

Edit Page



Java typeKotlin type
java.lang.Bytekotlin.Byte?
java.lang.Shortkotlin.Short?
java.lang.Integerkotlin.Int?
java.lang.Longkotlin.Long?
java.lang.Characterkotlin.Char?
java.lang.Floatkotlin.Float?
java.lang.Doublekotlin.Double?
java.lang.Booleankotlin.Boolean?

注意,如果java用了原始类型作为参数,那么在kotlin中转换为平台类型,比如:List<java.lang.Integer> 在kotlin中对应 List<Int!> 

Kotlin的集合类型可以是只读的,或者可变的,所以,跟java的集合类型对应关系如下  (下表里面的这些Kotlin 类型都在包 kotlin.collections里):

Java typeKotlin read-only typeKotlin mutable typeLoaded platform type
Iterator<T>Iterator<T>MutableIterator<T>(Mutable)Iterator<T>!
Iterable<T>Iterable<T>MutableIterable<T>(Mutable)Iterable<T>!
Collection<T>Collection<T>MutableCollection<T>(Mutable)Collection<T>!
Set<T>Set<T>MutableSet<T>(Mutable)Set<T>!
List<T>List<T>MutableList<T>(Mutable)List<T>!
ListIterator<T>ListIterator<T>MutableListIterator<T>(Mutable)ListIterator<T>!
Map<K, V>Map<K, V>MutableMap<K, V>(Mutable)Map<K, V>!
Map.Entry<K, V>Map.Entry<K, V>MutableMap.MutableEntry<K,V>(Mutable)Map.(Mutable)Entry<K, V>!

Java'的对应如下:

Java typeKotlin type
int[]kotlin.IntArray!
String[]kotlin.Array<(out) String>!

注意: java的static 变量不能作为kotlin companion 对象直接访问,必须要带上java类型才可以,比如 java.lang.Integer.toHexString(foo).

参考文献:https://kotlinlang.org/docs/reference/java-interop.html




转载于:https://blog.51cto.com/kankan/2395309

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

Kotlin与Java互操作 的相关文章

随机推荐

  • 树莓派3b+安装

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 贴散热片 xff1a 背面一片 xff0c 正面两篇 二 系统安装 xff1a 1 使用SD Formatter格式化SD卡 2 使用Win32DiskImager写入
  • Amap地图轨迹

    最近在做运动相关的项目 xff0c 需要运动轨迹 xff0c 接了一下Google xff0c 头一天还能获取Location xff0c 之后就没法用了 xff0c 所以换成高德 xff0c 高德的地图包Amap 使用高德地图定位Loca
  • 实现一个最小的 CSS 响应式布局系统

    阳光里她在院子中央晾晒着衣裳 在四季的风中她散着头发安慰着时光 赵雷 南方姑娘 响应式布局系统 xff0c 在现在流行的 CSS 框架中已经非常常见了 它主要由容器类和约定一行列数的栅格系统组成 xff0c 组成了一个框架的骨架 在流行的前
  • 写了一个拖动排序插件

    drag js drag js是一款拖动排序插件 xff0c 适配pc端和手机端 demo地址 tls1234 github io drag html 结构 lt ul class 61 34 item group 34 gt lt li
  • 关于工程效能的思考

    继阿里大中台之后 xff0c 现在的科技公司大多有一支致力于提升公司研发效率和沟通协作的工程效能团队 xff0c 作为这样团队的一员 xff0c 却看到愿景和现实激烈碰撞 xff0c 不禁有如下思考 效率的提升并不能减少工作时长 就拿前端研
  • May-周记(1)

    1 封装一个ajax span class hljs comment 封装一个ajax原生写法 span span class hljs function span class hljs keyword function span span
  • 程序员从阿里、京东、美团…面试回来,这些面试题你都会吗?

    面试 xff0c 难还是不难 xff1f 最终结果好还是不好 xff1f 取决于面试者的底蕴 xff08 气场 43 技能 xff09 心态和认知以及沟通技巧 而一些主流的大型互联网公司面试 xff08 阿里巴巴 京东 美团 滴滴 xff0
  • js深拷贝和浅拷贝

    数组的深浅拷贝 浅拷贝 var arr 61 span class hljs string 34 One 34 span span class hljs string 34 Two 34 span span class hljs strin
  • OpenGL/OpenGL ES入门:纹理初探 - 常用API解析

    系列推荐文章 xff1a OpenGL OpenGL ES入门 xff1a 图形API以及专业名词解析 OpenGL OpenGL ES入门 xff1a 渲染流程以及固定存储着色器 OpenGL OpenGL ES入门 xff1a 图像渲染
  • 获取hadoop集群资源信息

    根据hadoop提供的restful接口获取 http hadoop apache org docs stable gt YARN REST APIs gt Resource Manager 1 获取每个node的信息 import url
  • java版电子商务spring cloud分布式微服务b2b2c社交电商 (八)springboot整合mongodb

    电子商务社交平台源码请加企鹅求求 xff1a 三五三六二四七二五九 准备工作 安装 MongoDBjdk 1 8maven 3 0idea 环境依赖 在pom文件引入spring boot starter data mongodb依赖 xf
  • 金丝雀发布、滚动发布、蓝绿发布到底有什么差别?关键点是什么?

    为什么80 的码农都做不了架构师 xff1f gt gt gt 根据 2017 年的 DevOps 发展报告 xff0c 高效能组织和低效能组织在软件交付的效率上有数量级上的差异 技术组织的软件交付能力是一种综合能力 xff0c 涉及众多环
  • MongoDB的无缝集成,重拾后端之Spring Boot

    MongoDB是什么 xff1f MongoDB是一个NoSQL数据库 xff0c 是NoSQL中的一个分支 xff1a 文档数据库 和传统的关系型数据库比如Oracle SQLServer和MySQL等有很大的不同 传统的关系型数据库 x
  • 关于区块链智能合约的真相

    2019独角兽企业重金招聘Python工程师标准 gt gt gt title 关于智能合约的真相 就像 区块链 xff0c AI 和 云 这样的词语一样 xff0c 智能合约 也是那些得到大量炒作的短语之一 毕竟 xff0c 没有什么比不
  • 访问者模式

    2019独角兽企业重金招聘Python工程师标准 gt gt gt https blog csdn net jason0539 article details 45146271 转载于 https my oschina net u 2511
  • zip不是内部或外部命令,也不是可执行程序”详细解决办法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 书中第11章学习实例 xff1a 将文件备份成一个zip文件 xff08 python实现 xff09 书中源码 xff08 文件目录是自己新建文件夹的路径 xff0c 和
  • Struts2学习:HelloWorld

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 项目结构 xff1a 1 用IDEA新建一个SpringBoot 43 Maven的项目 2 新建的项目是没有webapp WEB INF 与web xml文件的 xff0
  • 泛型--继承泛型

    2019独角兽企业重金招聘Python工程师标准 gt gt gt package com atguigu javase generic import java util ArrayList import java util List im
  • springboot之读取配置文件

    1 propertie配置读取数据 通过value取配置文件中的数据 64 Component 64 PropertySource value 61 34 config db config properties 34 public clas
  • Kotlin与Java互操作

    1 xff0c Kotlin 调用Java import java util fun demo source List lt Int gt val list 61 ArrayList lt Int gt for item in source