【问题标题】:Kotlin generic type issueKotlin 泛型类型问题
【发布时间】:2017-12-06 21:16:10
【问题描述】:

我在泛型类型中迷失了很多小时。我想简化代码,但是当它的泛型类型时我不能转换对象。我该如何解决这个问题或其他简化的方法? (I'm use kotlin 1.2)

sealed class SETTING(override val key: String) : SettingsKeyContract

object optFirstLaunch : SETTING("first_launch"), SettingsKeyContractWithType<Boolean> {
    override val defaults = true
}

object optNotifications : SETTING("notification_list"), SettingsKeyContractWithType<List<String>> {
    override val defaults = emptyList<String>()
}

interface SettingsKeyContract { val key: String }
interface SettingsKeyContractWithType<T : Any> : SettingsKeyContract {

    val defaults: T

    @Suppress("UNCHECKED_CAST")
    fun get(): T?       = (App.getContentComponent()?.getSettings()?.get(key)?.value?.data as? T)
    fun remove()        = (App.getContentComponent()?.getSettings())?.delete(key)
    fun save(value: T)  = (App.getContentComponent()?.getSettings()?.add(key, value))

}

class OptionModel(@OPTIONS_ID optionId: Int, contract: SettingsKeyContract)

val optionModel = OptionModel(1, optNotifications)
when(optionModel.contract){
    is SettingsKeyContractWithType<List<String>> -> (optionModel.contract as SettingsKeyContractWithType<List<String>>).set(listOf("ring-1", "ring-2")) //error
    is SettingsKeyContractWithType<Boolean> -> (optionModel.contract as SettingsKeyContractWithType<Boolean>).set(true)  //error
}

错误:

Cannot check for instance of erased type: SettingsKeyContractWithType<...>

【问题讨论】:

    标签: generics kotlin


    【解决方案1】:

    请查看语言参考中对泛型类型的类型擦除和类型检查的解释:Type erasure and generic type checks

    基本上,您无法进行这种检查,因为SettingsKeyContractWithType 的实例在运行时不包含有关其实际类型参数的任何信息。

    您可以在这里尝试的一个选项是添加 make SettingsKeyContractWithType 显式存储类型参数的一些表示。一个简单的KClass 似乎不合适,因为它不能代表一个具体的泛型类型(List&lt;String&gt; 不能有一个KClass

    如果这确实是您想要的,请考虑使用超类型标记技术,如下所述:(link)

    您可以将TypeReference&lt;T&gt; 属性添加到SettingsKeyContractWithType,将其填充到具有具体类型参数的内联工厂函数中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      相关资源
      最近更新 更多