天天看點

Kotlin基礎(五)Kotlin的類型系統Kotlin的類型系統

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