Kotlin的類型系統
一、可空類型
1 //s為null的話編譯器會報錯,沒問号不能為空
2 fun strLen(s : String)=s.length
3 //如果允許s為空可:
4 fun strLen2(s : String?) : Int{
5 if (s!=null) return s.length
6 else return 0
7 }
8 /*
9 注意可空類型和不可空類型隻是在編譯期做的
10 檢查不同,runtime這兩者并無差別
11 */
12
13
14 //"?."的用法
15 fun strLen3(s : String?) :Int?=s?.length
16 //相當于
17 fun strLen4(s : String?) :Int?{
18 //如果是為null則傳回null,不為null就傳回"."後面的調用結果
19 if (s!=null) return s.length
20 else return null
21 }
22
23 //"?:"的用法
24 fun foo(s: String?){
25 //如果為null,則s="",s不為null其值為自身不變
26 val t: String=s ?: ""
27 }
28 //結合使用
29 fun strLenSafe(s: String?) :Int=s?.length?:0
30
31 //"as?"的用法:嘗試将一個值轉換為指定類型,轉換不成功則傳回null
32 class Person(val firstName: String, val lastName: String) {
33 override fun equals(o: Any?): Boolean {
34 val otherPerson = o as? Person ?: return false
35 return otherPerson.firstName == firstName &&
36 otherPerson.lastName == lastName
37 }
38 override fun hashCode(): Int =
39 firstName.hashCode() * 37 + lastName.hashCode()
40 }
41
42 //非空判斷"!!"用法
43 fun ignoreNulls(s:String?) {
44 val sNotNull: String=s!!
45 //do sth
46 }
1 /**
2 * let函數:把一個調用它的對象變換為lambda表達式的參數
3 * */
4
5 fun sendEmail(address: String)= println("Send an email to $address")
6
7 fun main(args: Array<String>) {
8 //複雜的做法
9 val address: String?="[email protected]"
10 if (address!=null) sendEmail(address)
11 //使用let函數簡化代碼
12 address?.let(::sendEmail)
13 }
1 class Girle {
2 //lateinit修飾符,延遲初始化,但不能延遲基礎類型
3 private lateinit var age : Secrit
4 }
5
6 class Secrit
類型參數的可空性:在Kotlin中所有泛型類和泛型函數的類型參數預設都是可空的,要使類型參數非空,必須為它指定一個非空的上界。
fun <T: Any> printHashCode(t: T){
println(t.hashCode())
}
二、基本資料類型和其他基本類型
1.Kotlin表面上并不區分基本類型和其包裝類型,但實際上基本類型,如數字類型盡可能地被高效地使用
是以大多數情況下它們會被編譯為基本類型,唯一不可行的是泛型類。
2.在Kotlin中使用Java時,Java的基本類型一定會被編譯為非空類型,而不是平台類型。
3.任何時候隻要使用了基本類型的可空版本,它們就會變為包裝類型。
4.Any:所有非空類型(包括基本類型)的超類。把基本資料類型指派給Any時會自動裝箱。Any隻能使用Java中equals,toString,hashCode方法,其他方法并不能使用。
5.Unit:Kotlin中的“void”
1 interface Pro<T>{
2 fun p() : T
3 }
4
5 /*
6 * 與Java中的void不同的是Unit是一個完備的類型
7 * 可以作為類型參數,而void卻不行。
8 * */
9 class NoResultPro : Pro<Unit>{
10 //當使用泛型時,Unit表示沒有值
11 override fun p() {
12 //do sth
13 }
14 }
6.Nothing類型:表示這個函數永遠不會傳回。
1 fun fail(msg: String): Nothing{
2 throw IllegalStateException(msg)
3 }
三、集合與數組
1.可空性和集合:Kotlin完全支援類型參數的可空性。
2.隻讀集合和可變集合:Kotlin的集合設計和Java不同的是,把通路集合資料的接口和修改集合的資料接口分開了。
但要注意:隻讀集合并不是不變的,并不是線程安全的。因為,隻讀集合可能隻是同一個集合衆多引用中的一個。
fun <T> copyEle(source: Collection<T>,target: MutableCollection<T>){
for (item in source) target.add(item)
}
3.Kotlin集合和Java集合:可變接口直接對應Java中的集合接口,隻讀版本缺少了所有産生改變的方法。
4.作為平台類型的集合:向Java方法傳遞可讀集合沒有用(Java可以修改它)
5.Kotlin中的一個數組是一個帶有類型參數的類,建立數組的方法:
1 fun main(args: Array<String>) {
2 //arryof建立數組
3 val ar=arrayOf("one","tow","three","four")
4 //arryOfNulls建立一個給定大小的數組,包含的是null元素
5 val s = arrayOfNulls<String?>(8)
6 //Array構造方法接收數組的大小和一個lambda表達式(用來建立每一個元素)
7 Array<String>(22) {m -> ("b"+m)}
8 }
基本類型數組:
1 fun main(args: Array<String>) {
2 val s=IntArray(3)
3 val m= intArrayOf(1,2,3,4)
4 val h=IntArray(5){i -> i*8}
5 }
轉載于:https://www.cnblogs.com/Shadowplay/p/8053943.html