【问题标题】:Kotlin Generic & Cast. can not cast by Class type variableKotlin 通用和演员表。不能由类类型变量强制转换
【发布时间】:2022-01-06 22:25:07
【问题描述】:

我想创建哈希图,它可以为任何类型添加价值。 当我得到它时,我想知道我可以投射什么

所以我像这样创建了这个 TypeMap

class TypeMap<K, V, C : Class<*>> {
    private var valueMap = HashMap<K, V>()
    private var classMap = HashMap<K, C>()

    fun getValue(key: K): V? {
        return valueMap[key] as V
    }

    fun getClass(key: K): C? {
        return classMap[key]
    }

    fun put(key:K, value:V, cls:C){
        valueMap[key] = value
        classMap[key] = cls
    }
}

我创建了实例并像这样放置值

var map= TypeMap<String, Any, Class<*>>()

var uData = UserData()

map.put("userName", "Marshall", String::Class.java)
map.put("userData", uData , UserData::Class.java)

并像这样使用它

var name = map.getValue("userName") as map.getClass("userName")

但不能施放

有人有什么好主意吗? 请帮帮我!

【问题讨论】:

  • 您创建此地图的用例是什么?
  • 您对此有何期待?实际上 Kotlin(如 Java)是一种静态类型语言,这是无效的。如果您知道该类,请用作通用参数,如果您不知道,那将如何帮助您。 (也许你可以在你的代码中使用不同的is ClassXis ClassY

标签: android class kotlin generics casting


【解决方案1】:

您可以使用cast 函数转换您的值。

val value = map.getValue("userName")
val clazz = map.getClass("userName")
val name = clazz.cast(value)

请注意,此转换的结果仍将是 Any,因为在编译时无法确定 clazz。所以你不能对这个name做任何字符串操作。

【讨论】:

    猜你喜欢
    • 2014-02-16
    • 1970-01-01
    相关资源
    最近更新 更多