4.1 Java语言和Kotlin语言对比(1)-基础类型

4.1 Java语言和Kotlin语言对比(1)

void类型的映射

Java中返回void类型,对应的Kotlin返回Unit

Java中特殊标识的转义

有些Kotlin定义的关键字,是Java中的合法标识名,例如in, object, is etc。如果Java库使用一个Kotlin的关键字作为函数名,可以转义之后再调用改函数,转义时添加 bracktick(`)字符

foo.`is`(bar)

空指针安全和平台类型

在Java语言中,任何对象类型引用都可能是null,而在Kotlin中,强制要求从Java中引用的对象是空指针安全null-safety的。这些在Java语言中定义的类型,在Kotlin中被特殊处理,统一称为平台类型 (platform types)。对于这些平台类型的空指针检查会宽松一些,对应的安全保证是和他们在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)

当我们调用平台类型变量的方法,Kotlin在编译期并不会报出空指针安全错误,这就导致在运行期可能会失败,原因可能是一个空指针异常(NPE)或者一个Kotlin产生的阻止空指针运行的断言。

item.substring(1) // allowed, may throw an exception if item == null

平台类型是non-denotable 的,意思是写的时候无法用显示地方式。当一个平台类型变量被赋值给一个Kotlin变量时,只能依赖类型推断(变量会有一个推断的平台类型,就想上面例子中的item),或者我们可以选择我们期待的类型,支持空指针的或者不支持空指针的都允许。

val nullable: String? = item // allowed, always works
val notNull: String = item // allowed, may fail at runtime

如果选择了不支持空指针的类型,编译器会针对这条赋值语句生成一个断言。这个断言可以防止Kotlin的不支持空指针的类型变量持有空指针。在把平台类型通过函数参数的方式传递给Kotlin函数的时候,也会有同样的断言。总的来说,编译器会尽最大努力去防止null影响更多的代码和程序,尽管有时因为泛型的原因也不可能完全消除。

平台类型的标记

如上所述,平台类型无法被显示描述,所以在Kotlin语言中没有对应的语法。尽管如此,编译器和IDE 有时还是需要有个标记的方法,例如在错误消息,参数描述等信息中。

  • T! means “T or T?”,
  • (Mutable)Collection! means “Java collection of T may be mutable or not, may be nullable or not”,
  • Array<(out) T>! means “Java array of T (or a subtype of T), nullable or not”

空指针注解

Java类型的空指针注解,不是按照平台类型来表示的,而是用真正的支持空指针或者不支持空指针的Kotlin类型。编译器支持一些空指针注解的风格,包括
- etBrains (@Nullable and @NotNull from the org.jetbrains.annotations package)
- Android (com.android.annotations and android.support.annotations)
- JSR-305 (javax.annotation)
- FindBugs (edu.umd.cs.findbugs.annotations)
- Eclipse (org.eclipse.jdt.annotation)
- Lombok (lombok.NonNull).
具体可以参见:Kotlin compiler source code.

基础类型的映射

Kotlin特殊处理了Java 的基础数据类型,把他们映射成了Kotlin中的类型。这种映射的改变是在编译时期的改变,运行时机器内存表示是保持一致的。

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

Java类型到Kotlin的映射

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.Charkotlin.Char?
java.lang.Floatkotlin.Float?
java.lang.Doublekotlin.Double?
java.lang.Booleankotlin.Boolean?
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值