<font face= 黑體>在 Kotlin 泛型(上) 中咱們已經將 Kotlin 的 泛型基礎 講完了,想要學習泛型進階,咱們要先了解幾個類。java
<font face= 黑體>只須要在一個普通類的前面加一個 data,普通類就變成了數據類了,能夠將它和 Java 的 JavaBean 作類比,以下:git
data class Book(val id: Long, val name: String, val author: Person)
<font face= 黑體>上面代碼中定義在柱構造器中的屬性又稱爲 component,能夠經過調用 book.component 方法獲取到構造器中屬性的值。github
val id = book.component1() val name = book.component2() val author = book.component3()
JavaBean | data class | |
---|---|---|
構造方法 | 默認無參構造 | 屬性做爲參數 |
字段 | 字段私有,Getter/Setter 公開 | 屬性 |
繼承性 | 可繼承也可被繼承 | 不可被繼承 |
component | 無 | 想等性、解構等 |
<font face= 黑體>咱們先來看一下 data class 的性質,以下:segmentfault
<font face= 黑體>經過上圖咱們知道咱們應該把 data class 當成一個數據結構來使用,不須要額外的實現,而且屬性類最好是基本類型和不可變的來保證 data class 不產生邏輯。
Java:數據結構
enum State { Idle, Busy } // 經過 name 方法返回名字 Idle State.Idle.name() // 經過 ordinal 返回序號 0 State.Idle.ordinal()
Kotlin:ide
enum class State { Idle, Busy } // 經過 name 方法返回名字 Idle State.Idle.name // 經過 ordinal 返回序號 0 State.Idle.ordinal
sealed class PlayerState { // 構造器私有 constructor() constructor(int: Int) }
// 包裝 Int 類型,必須是 val inline class BoxInt(val value: Int)
inline class BoxInt(val value: Int) { operator fun inc(): BoxInt { return BoxInt(value + 1) } }
<font face= 黑體>內聯類能夠實現接口,但不能繼承父類也不能被繼承。學習
// 實現接口是能夠的 inline class BoxInt(val value: Int): Comparable<Int> { override fun compareTo(other: Int) = value.compareTo(other) }
源碼 已上傳至 github,有須要能夠直接下載。優化