4.1 Java语言和Kotlin语言对比(2) 泛型和数组
2017-05-31 10:28
591 查看
4.1 Java语言和Kotlin语言对比(2)
注意Java中基础类型的装箱类型当用作类型参数时被映射成了平台类型。
例如,
集合类型在Kotlin中有可能是只读或者不可变的,所以Java的集合类型被映射如下:(本表中的所有Kotlin类型都在包
Java
当把Java中的泛型类型引入到Kotlin的时候,做了如下转换。
Java的
和Java一样,Kotlin的泛型在运行时也不能被
Java平台上数组和基础数据类型被用来减少装箱/拆箱操作带来消耗。 由于Kotlin隐藏了这些实现的细节,必须要使用一个规避方法来和Java代码交互。这些就是对于每个基础数据类型数组的特殊类型(
假设下面的Java函数接受一个int 类型的数组
在Kotlin中可以传一个基础数据类型的数据当做参数
当编译成JVM代码时,编译器会优化数组的访问,因此没有引入额外的开销。
甚至在使用index 的时候,也没有额外的开销
最后
注意Java中基础类型的装箱类型当用作类型参数时被映射成了平台类型。
例如,
List<java.lang.Integer>在Kotlin中被映射成
List<Int!>
集合类型在Kotlin中有可能是只读或者不可变的,所以Java的集合类型被映射如下:(本表中的所有Kotlin类型都在包
kotlin.collections下)
Java type | Kotlin read-only type | Kotlin mutable type | Loaded platform type |
---|---|---|---|
Iterator | Iterator | MutableIterator | (Mutable)Iterator! |
Iterable | Iterable | MutableIterable | (Mutable)Iterable! |
Collection | Collection | MutableCollection | (Mutable)Collection! |
Set | Set | MutableSet | (Mutable)Set! |
List | List | MutableList | (Mutable)List! |
ListIterator | ListIterator | MutableListIterator | (Mutable)ListIterator! |
Map | Map | MutableMap | (Mutable)Map! |
Map.Entry | Map.Entry | MutableMap.MutableEntry | (Mutable)Map.(Mutable)Entry! |
arrays的映射如下:
Java type | Kotlin type |
---|---|
int[] | kotlin.IntArray! |
String[] | kotlin.Array<(out) String>! |
Java泛型在Kotlin中的表示
Kotlin中的泛型和Java中略有不同。(详见generics)。当把Java中的泛型类型引入到Kotlin的时候,做了如下转换。
Foo<? extends Bar>变成了
Foo<out Bar!>!
Foo<? super Bar>变成了
Foo<in Bar!>!
Java的
raw types被转换成了
star projections
List变成了
List<*>!。例如
List<out Any?>!
和Java一样,Kotlin的泛型在运行时也不能被
retained例如,对象在被当做类型参数被传递给构造函数的时候,没有带有类型信息。 例如,
ArrayList<Integer>和
ArrayList<Character>没有分别。这样就无法使用
is-check来判断泛型。 Kotlin仅支持
is-check来判断
star-projected泛型。
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
JavaArrays
在Kotlin中Arrays是非协变的invariant, 和Java不同。这意味着无法把
Array<String>赋值给
Array<Any>, 这可以防止一些潜在的运行时错误。在Kotlin中,把一个子类的数组当做一个父类的数组传递给一个函数是不允许的,但是传递给Java函数中是可以的(通过
Array<(out) String>!)。
Java平台上数组和基础数据类型被用来减少装箱/拆箱操作带来消耗。 由于Kotlin隐藏了这些实现的细节,必须要使用一个规避方法来和Java代码交互。这些就是对于每个基础数据类型数组的特殊类型(
IntArray, DoubleArray, CharArray等)。这些类型和
Array类型无关,并且被编译成Java的基础数组类型来获得最好的性能。
假设下面的Java函数接受一个int 类型的数组
public class JavaArrayExample { public void removeIndices(int[] indices) { // code here... } }
在Kotlin中可以传一个基础数据类型的数据当做参数
val javaObj = JavaArrayExample() val array = intArrayOf(0, 1, 2, 3) javaObj.removeIndices(array) // passes int[] to method
当编译成JVM代码时,编译器会优化数组的访问,因此没有引入额外的开销。
val array = arrayOf(1, 2, 3, 4) array[x] = array[x] * 2 // no actual calls to get() and set() generated for (x in array) { // no iterator created print(x) }
甚至在使用index 的时候,也没有额外的开销
for (i in array.indices) { // no iterator created array[i] += 2 }
最后
in-checks也没有额外的开销
if (i in array.indices) { // same as (i >= 0 && i < array.size) print(array[i]) }
相关文章推荐
- 4.1 Java语言和Kotlin语言对比(3)
- 4.1 Java语言和Kotlin语言对比(1)-基础类型
- 从头认识java-13.11 对比数组与泛型容器,观察类型擦除给泛型容器带来什么问题?
- java数组、泛型、集合在多态中的使用及对比
- php数组----初探谈任何语言恒古不变的是算法和思想谈与Java中的数组对比
- Java与C语言数组实现机理的一点对比
- Kotlin对比Java——高效Android开发语言,值得一探究竟......
- Java 5.0 泛型之 Java泛型数组
- Java语言基础 数组的二分查找法
- 初学python(对比java语言不同) 第八篇
- 算法(第四版)笔记<一>-------动态队列的数组实现(Java语言)
- C 语言泛型数组实现
- java语言复制数组的四种方法
- 嵌入式语言对比之 JavaME vs QtC++
- 从头认识java-14.1 再次对比数组与容器
- java 语言程序设计-李尊朝 第5章 数组 练习答案
- 黑马程序员_01_Java语言基础部分(数据类型与表达式、流程控制语句、数组与方法)
- [java学习笔记]java语言基础概述之数组的定义&常见操作(遍历、排序、查找)&二维数组
- [转]java中泛型创建数组的总结
- Java语言基础(六)-数组