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




相关内容

热门资讯

“南鼠北调”为攻击蒋万安?蓝营... 海峡导报综合报道 台北、新北地区近期分别发生“汉坦病毒”死亡及确诊个案,使鼠患问题引发关注。“青鸟”...
巴拿马外长喊话访华团:尊重中国... 【文/观察者网 柳白】据香港英文媒体《南华早报》报道,数名巴拿马议员组成的代表团抵达中国访问之际,巴...
华帝燃气灶自动熄火什么原因 原因:热敏针出现故障,检查灶眼,看中间的火焰能不能烧到探针,烧到探针才能定住火,在点火的时候,长按几...
燃气灶一直打火滴滴响然后熄火 原因可能是在刚打开的时候马上熄火了,这种情况比较复杂,建议首先检查燃气灶出火的地方是否堵塞,对出火口...
煤气灶一直打火嗒嗒嗒响怎么修理 问题:煤气灶一直打火嗒嗒嗒响怎么修理回答:1、有时候煤气灶的电路出现了接触不良,就会导致在使用过程当...
天然气灶打不着火一直滴滴响 1、没有燃气,在碰到天然气灶打不着火时,首先要查看是否还有燃气。2、电池没电,发现点不着火而且没有哒...
燃气打不着火一直滋滋响就是不着 点火针位置不正确,只要调整点火针就可以了。托起燃气灶拧开镙丝钉,打开密封盖,揭起钢化玻璃面板。安装上...
亲绿民调中柯志恩追近13%,蓝... 海峡导报综合报道 岛内亲绿媒体5日公布高雄市长选举民调,民进党民代赖瑞隆以47%支持度暂时领先国民党...
拒绝美国干涉,巴拿马议员抵华交... “我们是一个自由且拥有主权的国家……我们想去哪里,就去哪里。”正在中国访问的巴拿马民主革命党议员哈伊...
高市下跪了,但更值得警惕 我相信,中国、韩国等很多亚洲国家的朋友,看到这一幕,心头翻涌的不是感慨,更多是气愤。日本首相高市早苗...