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, isetc。如果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 type | Kotlin type |
---|---|
byte | kotlin.Byte |
short | kotlin.Short |
int | kotlin.Int |
long | kotlin.Long |
char | kotlin.Char |
float | kotlin.Float |
double | kotlin.Double |
boolean | kotlin.Boolean |
Java类型到Kotlin的映射
Java type | Kotlin type |
---|---|
java.lang.Object | kotlin.Any! |
java.lang.Cloneable | kotlin.Cloneable! |
java.lang.Comparable | kotlin.Comparable! |
java.lang.Enum | kotlin.Enum! |
java.lang.Annotation | kotlin.Annotation! |
java.lang.Deprecated | kotlin.Deprecated! |
java.lang.CharSequence | kotlin.CharSequence! |
java.lang.String | kotlin.String! |
java.lang.Number | kotlin.Number! |
java.lang.Throwable | kotlin.Throwable! |
Java封装类型到Kotlin的映射
Java type | Kotlin type |
---|---|
java.lang.Byte | kotlin.Byte? |
java.lang.Short | kotlin.Short? |
java.lang.Integer | kotlin.Int? |
java.lang.Long | kotlin.Long? |
java.lang.Char | kotlin.Char? |
java.lang.Float | kotlin.Float? |
java.lang.Double | kotlin.Double? |
java.lang.Boolean | kotlin.Boolean? |
相关文章推荐
- 4.1 Java语言和Kotlin语言对比(2) 泛型和数组
- 4.1 Java语言和Kotlin语言对比(3)
- Java语言基础:基本数组类型
- java语言基础——3基本数据类型
- 【Java语言基础】数据类型详解
- [Java入门笔记] Java语言基础(二):常量、变量与数据类型
- Java语言基础 数据类型
- Java语言基础--基本数据类型与运算符
- 01_Java语言基础部分(数据类型与表达式、流程控制语句、数组与方法)
- Java语言基础1——基本数据类型
- java基础---语言组成、数据类型、运算符
- [Java入门笔记] Java语言基础(二):常量、变量与数据类型
- 黑马程序员——Java语言基础——关键字、表示符、常量、变量及数据的类型、运算符
- 黑马程序员——Java语言基础:String、基本数据类型对象包装类
- Java语言基础09-数据类型
- Java语言基础——数据类型转换
- 黑马程序员—Java语言基础(关键字、标识符、注释、常量与变量、进制、数据类型、类型转换、代码示例)
- Java语言基础(关键字、标识符、注释、常量与变量、进制、数据类型、类型转换、代码示例)
- Java新手之路——Day03 Java语言基础组成_数据类型
- Java语言基础(类型提升&强制转换)