Kotlin 資料類與密封類

2021-10-01 09:43:20 字數 4195 閱讀 8165

kotlin可建立乙個只包含資料的類,關鍵字為data

data class person(val name:string, val age:int)

編譯器會自動的從主建構函式中根據所有宣告的屬性提取以下函式:

equals()

//hashcode()

tostring()

//格式如 "user(name=john, age=42)"

componentn()

//functions 對應於屬性,按宣告順序排列

copy()

//函式

如果這些函式在類中已經被明確定義了,或者從超類中繼承而來,就不再會生成。

為了保證生成**的一致性以及有意義,資料類需要滿足以下條件:

主建構函式至少包含乙個引數

所有的主建構函式的引數必須標識為val 或者 var

資料類不可以宣告為 abstract,open, sealed 或者 inner

資料類不能繼承其他類 (但是可以實現介面)

複製

fun copy(name: string = this.name, age: int = this.age) = user(name, age)

複製資料類,並修改屬性的值

data

class

user

(val name: string,

val age: int)

funmain

(args: array

)

資料類及解構宣告

val jane =

user

("jane",35

)val

(name, age)

= jane

println

("$name, $age years of age"

)// prints "jane, 35 years of age"

標準資料類 標準庫提供了 pair 和 triple

密封類用來表示受限的類繼承結構:當乙個值為有限幾種的型別, 而不能有任何其他型別時。

宣告乙個密封類,使用 sealed 修飾類,密封類可以有子類,但是所有的子類都必須要內嵌在密封類中。

不能修飾 inte***ce,abstract class(會報 warning,但是不會出現編譯錯誤)

sealed

class expr

data

class

const

(val number: double)

:expr()

data

class

sum(

val e1: expr,

val e2: expr)

:expr()

object notanumber :

expr()

funeval

(expr: expr)

: double =

when

(expr)

泛型,即 「引數化型別」,將型別引數化,可以用在類,介面,方法上。

class box

(t : t)

funmain

(args: array

)

泛型約束

我們可以使用泛型約束來設定乙個給定引數允許使用的型別。

kotlin 中使用 : 對泛型的型別上限進行約束。

fun

>

sort

(list: list)/*

comparable的子類的替代t

*/sort

(listof(1

,2,3

))// ok。int 是 comparable的子型別

sort

(listof

(hashmap()

))// 錯誤:hashmap不是 comparable> 的子型別

對於多個上界約束,可使用where語句

fun

copywhengreater

(list: list

, threshold: t)

: list

where t : charsequence,

t : comparable

.map

}

型變

宣告處型變/型別投影

宣告處的型別變異使用協變註解修飾符:in/out,消費者 in, 生產者 out。

使用 out 使得乙個型別引數協變,協變型別引數只能用作輸出,可以作為返回值型別但是無法作為入參的型別。

// 定義乙個支援協變的類

class runoob<

out a>

(val a: a)

}fun

main

(args: array

)

使用in則只能作為入參而不能輸出。

// 定義乙個支援逆變的類

class runoob<

in a>

(a: a)

}fun

main

(args: array

)

星號投射

如果乙個泛型型別中存在多個型別引數, 那麼每個型別引數都可以單獨的投射. 比如, 如果型別定義為inte***ce function, 那麼可以出現以下幾種星號投射:

function<*, string> //代表 function;

function//代表 function;

function<, > //代表 function.

class a

(val t: t,

val t2 : t,

val t3 : t)

class

(var name : string)

funmain

(args: array

)}

列舉常量用逗號分隔,每乙個列舉常量都是乙個物件。

enum

class color

列舉初始化
enum

class

color

(val rgb:int)

預設名稱為列舉字元名,值從0開始。若需要指定值,則可以使用其建構函式。

enum

class

shape

(value:int)

列舉還支援以宣告自己的匿名類及相應的方法、以及覆蓋基類的 方法。

enum

class protocolstate

, talking

;abstract

funsignal()

:protocalstate

}

如果列舉類定義任何成員,要使用分號將成員定義中的列舉常量定義分隔開

使用列舉常量

kotlin 中的列舉類具有合成方法,允許遍歷定義的列舉常量,並通過其名稱獲取列舉常數。

enumclass.

valueof

(value:string)

:enumclass //轉換指定name為列舉值,若未匹配成功,會丟擲illegalarguementexception

enumclass.

values()

:array

獲取列舉相關資訊

val name:string	//獲取列舉名稱

val ordinal:int //獲取列舉值在所有列舉陣列中定義的順序

例項

enum

class color

funmain

(args: array

)

Kotlin 資料類與密封類

資料類 kotlin 可以建立乙個只包含資料的類,關鍵字為 data data class user val name string,val age int 編譯器會自動的從主建構函式中根據所有宣告的屬性提取以下函式 equals hashcode tostring 格式如 user name jo...

Kotlin 資料類與密封類

密封類end kotlin 可以建立乙個只包含資料的類,關鍵字為data data class user val name string,val age int 編譯器會自動的從主建構函式中根據所有宣告的屬性提取以下函式 如果這些函式在類中已經被明確定義了,或者從超類中繼承而來,就不再會生成。為了保...

(十)kotlin資料類與密封類

kotlin 可以建立乙個只包含資料的類,關鍵字為 data data class user val name string val age int 編譯器會自動的從主建構函式中根據所有宣告的屬性提取以下函式 如果這些函式在類中已經被明確定義了,或者從超類中繼承而來,就不再會生成。為了保證生成 的一...