Generics Kotlin泛型类型问题

Generics Kotlin泛型类型问题,generics,kotlin,Generics,Kotlin,我在泛型中迷失了好几个小时。我想简化代码,但当对象的泛型类型为。我如何解决这个问题,或者用另一种简化的方法(我正在使用kotlin 1.2) 密封类设置(覆盖val键:字符串):设置SkeyContract 对象optFirstLaunch:设置(“首次启动”),设置SkeyContractWithType{ 覆盖val默认值=true } 对象选项通知:设置(“通知列表”),设置SkeyContractWithType{ override val defaults=emptyList() }

我在泛型中迷失了好几个小时。我想简化代码,但当对象的泛型类型为。我如何解决这个问题,或者用另一种简化的方法<代码>(我正在使用kotlin 1.2)

密封类设置(覆盖val键:字符串):设置SkeyContract
对象optFirstLaunch:设置(“首次启动”),设置SkeyContractWithType{
覆盖val默认值=true
}
对象选项通知:设置(“通知列表”),设置SkeyContractWithType{
override val defaults=emptyList()
}
接口设置skeycontract{val key:String}
接口设置SkeyContractWithType:设置SkeyContract{
val默认值:T
@抑制(“未选中的_CAST”)
乐趣获取():T?=(App.getContentComponent()?.getSettings()?.get(键)?.value?数据为?T)
乐趣移除()=(App.getContentComponent()?.getSettings())?.delete(键)
乐趣保存(值:T)=(App.getContentComponent()?.getSettings()?.add(键,值))
}
类OptionModel(@OPTIONS\u ID optionId:Int,contract:SettingsKeyContract)
val optionModel=optionModel(1,optNotifications)
何时(optionModel.contract){
是SettingsKeyContractWithType->(optionModel.contract作为SettingsKeyContractWithType)。set(listOf(“环-1”、“环-2”)//错误
是SettingsKeyContractWithType->(optionModel.contract作为SettingsKeyContractWithType)。set(true)//错误
}
错误:

Cannot check for instance of erased type: SettingsKeyContractWithType<...>
无法检查已擦除类型的实例:SettingsKeyContractWithType

请查看语言参考中泛型类型的类型擦除和类型检查说明:

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

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

如果这真的是你想要的,考虑使用超类型令牌的技术,如这里所描述的:


您可以将
TypeReference
属性添加到
SettingsKeyContractWithType
,在内联工厂函数中使用具体类型参数填充该属性。

请查看语言引用中泛型类型的类型擦除和类型检查说明:

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

您可以在此处尝试的一个选项是添加make
setingskeycontractwithtype
显式存储类型参数的某些表示形式。简单的
KClass
似乎不适合,因为它不能表示具体的泛型类型(对于
列表
,您不能有
KClass

如果这真的是你想要的,考虑使用超类型令牌的技术,如这里所描述的:

您可以将
TypeReference
属性添加到
SettingsKeyContractWithType
,并在内嵌工厂函数中使用具体化的类型参数填充该属性

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