Kotlingenericstypes的问题

我在几个小时内就被遗忘了。 我想简化代码,但是当它的genericstypes不能投射对象时。 我怎样才能解决这个问题或另一种简化的方式? (I'm use kotlin 1.2)

 sealed class SETTING(override val key: String) : SettingsKeyContract object optFirstLaunch : SETTING("first_launch"), SettingsKeyContractWithType { override val defaults = true } object optNotifications : SETTING("notification_list"), SettingsKeyContractWithType<List> { override val defaults = emptyList() } interface SettingsKeyContract { val key: String } interface SettingsKeyContractWithType : 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> -> (optionModel.contract as SettingsKeyContractWithType<List>).set(listOf("ring-1", "ring-2")) //error is SettingsKeyContractWithType -> (optionModel.contract as SettingsKeyContractWithType).set(true) //error } 

错误:

 Cannot check for instance of erased type: SettingsKeyContractWithType 

请参阅语言参考中对types擦除和genericstypes检查的说明: types擦除和genericstypes检查 。

基本上,你不能做这种检查,因为SettingsKeyContractWithType的实例在运行时不包含任何有关其实际types参数的信息。

您可以在此尝试的选项是添加make SettingsKeyContractWithType显式存储types参数的一些表示forms。 一个简单的KClass似乎不适合,因为它不能代表一个具体的genericstypes(你不能有一个KClass List

如果这真的是你想要的,考虑使用超级types的令牌的技术,如下所述:( 链接) 。

您可以将TypeReference属性添加到SettingsKeyContractWithType ,并将其填充到带有特定types参数的内联工厂函数中。