kotlin汇总9-在kotlin中调用java

4 篇文章 0 订阅

1.在kotlin中调用Java

下面的几乎全java代码都可以直接在kotlin使用

import java.util.*

fun demo(source: List<Int>) {
    val list = ArrayList<Int>()
    // 'for'-loops work for Java collections:
    for (item in source) {
        list.add(item)
    }
    // Operator conventions work as well:
    for (i in 0..source.size() - 1) {
        list[i] = source[i] // get and set are called
    }
}
1.1 Getters和Setters

Java中set/get开头的无参方式,在kotlin中可以直接当做属性使用,比如下面代码

import java.util.Calendar

fun calendarDemo() {
    val calendar = Calendar.getInstance()
    if (calendar.firstDayOfWeek == Calendar.SUNDAY) {  // call getFirstDayOfWeek()
        calendar.firstDayOfWeek = Calendar.MONDAY       // call setFirstDayOfWeek()
    }
}

另外需要注意,如果只有setter,那么在kotlin将会不可见,因为kotlin不支持set-only的属性。

1.2 方法返回void

Java中的void等于kotlin中的Unit

1.3 反义kotlin中的关键字

比如in, object, is 是kotlin中的关键字,
比如java代码

class Foo {
    boolean isBar(){
        retrurn true;
    }
}

在kotlin中调用这个方法,需要反义is,如下:

foo.`is`(bar) // 通过``包围可能是kotlin关键字
1.4 null安全和平台类型

因为所有Java的引用都可能是Null,所以所有来自Java的对象,你都需要像在Java中一样确保对象不为空

val list = ArrayList<String>() // non-null (constructor result)
list.add("Item")
val size = list.size() // non-null (primitive int)
val item = list[0] // platform type inferred (ordinary Java object)

val nullable: String? = item // allowed, always works
val notNull: String = item // allowed, may fail at runtime ,因为item有可能是null,但是notNull是不能为空,所以运行时会报错
1.5 类型映射

原始类型对应关系

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!

Java封装原始类型对应kotlin的可空类型

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?

注意

List<java.lang.Integer>对应kotlin的List<Int!> 

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泛型对应

Java的?通配符
Foo<? extends Bar> becomes Foo<out Bar!>!
Foo<? super Bar> becomes Foo<in Bar!>!
Java未加工类型
List becomes List<*>!, i.e. List<out Any?>!

kotlin仅仅允许*通配符使用is,例如

if (a is List<Int>) // Error: cannot check if it is really a List of Ints
// but
if (a is List<*>) // OK: no guarantees about the contents of the list

Java的不定参数

public class JavaArrayExample {

    public void removeIndices(int... indices) {
        // code here...
    }
}

在kotlin调用,使用*来传递

val javaObj = JavaArray()
val array = intArrayOf(0, 1, 2, 3)
javaObj.removeIndicesVarArg(*array)

在kotlin中使用JNI,使用external修饰符

external fun foo(x: Int): Double
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值