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 編譯器會自動的從主建構函式中根據所有宣告的屬性提取以下函式 如果這些函式在類中已經被明確定義了,或者從超類中繼承而來,就不再會生成。為了保證生成 的一...