Kotlin与Java互操作
admin
2023-02-17 10:20:01
0

1,Kotlin 调用Java

import java.util.*

fun demo(source: List) {
    val list = ArrayList()    
    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() // 不需要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! 意思是 "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 在kotlin中对应 List 

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

Java typeKotlin read-only typeKotlin mutable typeLoaded platform type
IteratorIteratorMutableIterator(Mutable)Iterator!
IterableIterableMutableIterable(Mutable)Iterable!
CollectionCollectionMutableCollection(Mutable)Collection!
SetSetMutableSet(Mutable)Set!
ListListMutableList(Mutable)List!
ListIteratorListIteratorMutableListIterator(Mutable)ListIterator!
MapMapMutableMap(Mutable)Map!
Map.EntryMap.EntryMutableMap.MutableEntry(Mutable)Map.(Mutable)Entry!

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




相关内容

热门资讯

【今日要闻】“吉林白山麻将开挂... 家人们!今天小编来为大家解答吉林白山麻将透视挂怎么安装这个问题咨询软件客服徽9752949的挂在哪里...
终于了解“决战武穴麻将怎么开挂... 您好:决战武穴麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9784099】很多玩家在这款...
终于懂了“乐乐四川麻将开挂器?... 终于懂了“乐乐四川麻将开挂器?”(太坑了原来有挂)您好,乐乐四川麻将这个游戏其实有挂的,确实是有挂的...
【今日要闻】“土豪赢三张开挂神... 有 亲,根据资深记者爆料土豪赢三张是可以开挂的,确实有挂(咨询软件无需打...
玩家攻略科普“人民棋牌有挂吗?... 家人们!今天小编来为大家解答人民棋牌透视挂怎么安装这个问题咨询软件客服徽4282891的挂在哪里买很...
【第一消息】“728可以开挂吗... 网上科普关于“728有没有挂”话题很是火热,小编也是针对728作*弊开挂的方法以及开挂对应的知识点,...
终于明白“新九方牛牛究竟有挂吗... 您好:新九方牛牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信【4282891】很多玩家在这款游...
玩家最新攻略“万圣节消除大作战... 您好:万圣节消除大作战这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9752949】很多玩家在...
中国医生,到底要不要做科研? 在最近召开的上海尚思自然科学研究院(以下简称“尚思”)年会上,4位在临床研究中表现出色的临床医生(医...
我来教教您“同城游跑胡子到底是... 家人们!今天小编来为大家解答同城游跑胡子透视挂怎么安装这个问题咨询软件客服徽9784099的挂在哪里...