您的位置:首页 > 编程语言 > Java开发

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

2017-05-26 10:23 399 查看

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?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java kotlin