当前位置: 首页 > 知识库问答 >
问题:

科特林泛型问题

郎磊
2023-03-14

我在一般类型中迷失了很多个小时。我想简化代码,但我不能强制转换对象时,它的泛型类型。我如何解决这个问题或另一个简化的方法?(我使用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<...>

共有1个答案

柴默
2023-03-14

请看一下语言参考:类型擦除和泛型类型检查中关于泛型类型的类型擦除和类型检查的解释。

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

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

 类似资料:
  • 如何在使用Kotlin的Spring Boot中正确初始化ConfigurationProperties? 目前我喜欢下面的例子: 但是它看起来很丑陋,实际上不是一个iable,foo是常量ue,应该在启动期间初始化,将来不会改变。

  • 我正在尝试IntDef typedef将特定类型的参数限制为函数。但是当我使用Java使用IntDef时,它工作正常,但同时,它不适用于kotlin。以下是我的代码片段 - 在JAVA中- 在静态编程语言中- 在课堂上使用- 调用演示函数给我一个错误消息,说它必须是:< code>TransTypeJava之一。CASH,< code>TransTypeJava。通过传递< code>TransT

  • 假设我有一个这样的Kotlin函数类型的Kotlin 1.1 我可以从Java访问它 是否有可能以某种方式从Java以科特林类型别名(即)访问科特林接口?

  • 问题内容: 我正在学习具有C ++和Java背景的Kotlin。我期待下面的打印,不。我知道这对应到。默认实现不比较每个成员,即和吗?如果是这样,它会不会看到字符串值相等(因为再次映射到字符串值)?显然,我在Kotlin中还没有涉及平等与身份相关的问题。 问题答案: 您描述的默认实现仅适用于数据类。不适用于从中继承实现的常规类,只需使对象与自身相等即可。

  • 这是正确的吗? 我可以找到一个相关的问题,但它是有参数的,我不能在没有params的情况下转换它。