iT邦幫忙

9

對Kotlin的sealed class機制不太清楚

  • 分享至 

  • xImage

我在寫一個標準化的宣告方式(用sealed class),但是發生了一些奇妙的情況,我不太理解

sealed class AppPreference<T>(
    val key: Preferences.Key<T>,
    val defaultValue: T
) {
    class Str(key: Preferences.Key<String>) : AppPreference<String>(key, "")
    class Bool(key: Preferences.Key<Boolean>) : AppPreference<Boolean>(key, false)
    class IntPref(key: Preferences.Key<Int>) : AppPreference<Int>(key, 0)
    object FINISHED_DESC : AppPreference.Bool(booleanPreferencesKey("finished_desc"))
}

我想要將這些Preference key在宣告時就有一個初始值,所以我設計了一個sealed class 含有key和default value
之後再設計了幾個比較常見的class,讓他們分別負責初始化各種型別
但是我發現我的FINISHED_DESC在這些class不是open的時候會報錯,他會顯示This type is final, so it cannot be extended
但是我理解的sealed class裡面的class皆可以直接使用,且變數可以宣告成object
我需要知道更深入的細節,雖然把class 改成open class就可以解決

抱歉打擾,我大概弄懂了
object本身只能繼承open class
而sealed class是半封閉的,對內open的class
但是在裡面宣告的class還是預設為final
所以他無法繼承,就算是在sealed class裡面

圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友回答

立即登入回答