您的位置:首页 > 其它

4、Kotlin数据类型

2020-06-29 05:02 84 查看

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,从编译的结果可以明确看出来。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: