4、Kotlin数据类型
1、基本数据类型
1.1、数据类型介绍
kotlin没有区分包装类和数据类型,他只有统一的数据类型。
1.2、数据类型与java不对等
但是kotlin里面的数据类型,不能完全的去对等java中的数据类型和包装类,举一个简单例子:
fun getInt1(): Int { // 默认不可为null,函数的书写后一讲会表述 return 0 } fun getInt2(): Int? { // 其中?表示可以返回null return 0 }
上面有两个函数,我们看一下转换成java的结果
public static final int getInt1() { // 不可为null的,转换java就是int return 0; } @Nullable public static final Integer getInt2() { // 可为null的情况,则为Integer return 0; }
故而从中我们可以看到,kotlin语言的灵活性,并且不可对等java的实现。
1.3、数据类型的长度
1.4、数据类型之间的转换
fun transfer() { var str: String = "1"; var i: Int = str.toInt(); var j: Long = str.toLong(); var h: Double = str.toDouble(); var m: Char = i.toChar(); var l: CharArray = str.toCharArray(); }
kotlin语言将数据之间的转化都扁平化,你想转换成什么,只要toXXX就可以了。我们看看他的转换成java的结果。
public static final void transfer() { String str = "1"; boolean var3 = false; int i = Integer.parseInt(str); boolean var5 = false; long j = Long.parseLong(str); boolean var7 = false; double h = Double.parseDouble(str); char m = (char)i; boolean var9 = false; Intrinsics.checkExpressionValueIsNotNull(str.toCharArray(), "(this as java.lang.String).toCharArray()"); }
java所有的实现方式,都是基于包装类的转换。并且有很多时候,实现的方式也不尽统一。
注:kotlin语言是支持无符号数的,但是由于java不支持,所以如果运行与java平台是没用的。
2、数组
我们这边先将,基本数据类型数组,也非常的直接,例如IntArray、DoubleArray。规律就是xxxArray。
fun getIntArray(): IntArray { return IntArray(10); // 10表示数组大小 } fun getDoubleArray(): DoubleArray { return doubleArrayOf(170.0, 180.0, 190.0) // 初始化一个double数组,并且包含特定元素 } fun getByteArray(): ByteArray { return ByteArray(10) { 1 }; // 初始化长度为10的byte数组,并且值都为1 } fun getShortArray(): ByteArray { return ByteArray(10) { i -> 1 }; // 初始化长度为10的short数组,并且值都为1 }
看一下java源码:
@NotNull public static final int[] getIntArray() { return new int[10]; } @NotNull public static final double[] getDoubleArray() { return new double[]{170.0D, 180.0D, 190.0D}; } @NotNull public static final byte[] getByteArray() { byte var0 = 10; byte[] var1 = new byte[var0]; for(int var2 = 0; var2 < var0; ++var2) { int var4 = false; byte var7 = 1; var1[var2] = var7; } return var1; } @NotNull public static final byte[] getShortArray() { byte var0 = 10; byte[] var1 = new byte[var0]; for(int var2 = 0; var2 < var0; ++var2) { int var4 = false; byte var7 = 1; var1[var2] = var7; } return var1; }
更多集合类,请关注。
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/
3、集合类
kotlin的集合类基本是与Java一致的,只是kotlin对大多数的集合类提供了一些很方便创建集合的方法,如下
fun getList(): List<String> { return listOf("1", "2", "3") // 创建list的时候,用listof,注意全小写 } fun getMap(): Map<String, String> { return hashMapOf(Pair("1", "1")); // 创建hashmap的的时候用hashmap } fun getArraySet(): ArraySet<String> { var set: ArraySet<String> = ArraySet(); // 定义一个arraySet的对象 set.add("!11"); // 增加一个值 return set; }
我们看一下编译后的java代码
@NotNull public static final List getList() { return CollectionsKt.listOf(new String[]{"1", "2", "3"}); // 通过kotlin辅助类创建list,该辅助类非常完全的帮助实现kotlin的list到java的转换 } @NotNull public static final Map getMap() { return (Map)MapsKt.hashMapOf(new Pair[]{new Pair("1", "1")}); // 类似的map } @NotNull public static final ArraySet getArraySet() { ArraySet set = new ArraySet(); // 不适用xxxOf的时候,与java基本一致。 set.add("!11"); return set; }
我们看一下编译后的java代码
这里面需要注意一点,不管是listOf 还是mapOf,这些都是没有固定类型的,我看查看源码也可以发现
public fun <T> listOf(element: T): List<T> = java.util.Collections.singletonList(element) // 单元素调用 public fun <T> listOf(vararg elements: T): List<T> = if (elements.size > 0) elements.asList() else emptyList() // 多元素调用 public fun <K, V> mapOf(pair: Pair<K, V>): Map<K, V> = java.util.Collections.singletonMap(pair.first, pair.second) // 单元素 public fun <K, V> mapOf(vararg pairs: Pair<K, V>): Map<K, V> = if (pairs.size > 0) pairs.toMap(LinkedHashMap(mapCapacity(pairs.size))) else emptyMap() // 多元素调用
虽然多元素的返回结果,在java里面都是可以增加元素的,但是在kotlin里面,List 和 Map都是没有增加元素的方法的,故而在官方文档里面说明了,这些方法都是返回的不可变集合。那如果要变成可变的咋办,两种办法:
HashMap<String, String>(map); // 强制转换 map.plus(Pair("1", "1")) // 有一个plus方法增加元素
但是还是推荐不要去不指定类型使用。
关于更多的集合知识,可参考官方文档
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/
4、其他常用类型
4.1、Unit
这个字段是对应java的oid字段,我们写一段函数
fun showUnit(): Unit { }
看看java编译结果:
public static final void showUnit() { }
这个字段在java 和 kotlin之间互调是有妙用的,java中的void是可以转换为kotlin中的Unit的。这个后面函数分析的时候会讲。
4.2、Nothing
Unit虽然可以替代void,但是他不能完全替代void,因为实际上java中void是表示没有返回值的,但是Unit还是可以打印的。那么我们想表示什么也不返回,用什么nothing。
而且Nothing还有其他的用途,参考源码EmptyList
internal object EmptyList : List<Nothing>, Serializable, RandomAccess { override fun get(index: Int): Nothing = throw IndexOutOfBoundsException("Empty list doesn't contain element at index $index.") }
当我们书写语句:
fun findAllPlayers(): List = emptyList()。可以看到,emptyList他就是明确的nothing类型的List,但是却可以赋值给明确类型的List
所以 nothing 其实表示不存在的值,但是他又可以理解为所有类的子类。
4.3、ANY
any就很好理解了,基本上可以类比java的object,从编译的结果可以明确看出来。
- Kotlin入门篇(一),基本数据类型介绍、变量和常量的声明
- Kotlin入门第三课:数据类型
- Kotlin学习笔记2 : 变量常量与基本数据类型
- Kotlin数据类型(二:装箱和拆箱)
- Kotlin 基本数据类型
- 二、Kotlin基本数据类型
- 《Kotlin 极简教程 》第4章 基本数据类型与类型系统
- Kotlin基础知识碎片1——kotlin数据类型与java的不同之处
- 分享下学习Kotlin的历程-变量/数据类型(1)
- (四)kotlin基本数据类型
- Kotlin学习日记(一)Kotlin介绍与数据类型
- 《Kotlin 极简教程 》第4章 基本数据类型与类型系统
- Kotlin数据类型
- Kotlin------数据类型和语法
- Kotlin------数据类型和语法
- Android开发,Kotlin的了解与学习(二)-----Kotlin数据类型与Extensions的学习
- Kotlin数据类型(一:数据类型)
- kotlin入门(二)数据类型
- Kotlin教程之基本数据类型
- [置顶] Kotlin的变量和数据类型