未解决的参考:T
我需要创建一个数据类:
data class MyClass(val b: Boolean, val s: String, val flags: Map<Key<T>, T>)
由于“未解决的参考:T”
在flags
映射中,我需要Key<String>, String
和Key<Int>, Int
对,但不要Key<String>, Int
任何想法,我怎么能做到这一点?
你不能直接通过类型系统来做到这一点,你将不得不使用封装来确保键和值的类型是一致的。 这个问题也存在于Java中。
由他人提供的解决方案是行不通的,因为你只能将一种类型的键/值放到地图中(使Map<Key<T>, T>
有点缺陷):
val map = mutableMapOf<Key<String>, String>() // what to put as generic params here? map[Key<String>()] = "blah" // works map[Key<Int>()] = 3 // doesn't work! map[Key<Int>()] = "blah" // compiler error (as intended)
要么:
val map = mutableMapOf<Key<*>, Any?>() map[Key<String>()] = "blah" // works map[Key<Int>()] = 3 // works map[Key<Int>()] = "blah" // works, but is wrong.
例如,你必须在地图上编写自己的封装,以确保密钥始终与值匹配:
class MutableKeyMap { private val map = mutableMapOf<Key<*>, Any?>() // private / encapsulated operator fun <T> get(key: Key<T>): T { return map[key] as T } operator fun <T> set(key: Key<T>, value: T): Unit { // Key's T must match value's type. map[key] = value } }
(如果你愿意,你可以添加一个不可变的超级接口)
然后用它作为一个字段:
data class MyClass(val b: Boolean, val s: String, val flags: MutableKeyMap)
…
val map = MutableKeyMap() map[Key<String>()] = "blah" // works map[Key<Int>()] = 3 // works map[Key<Int>()] = "blah" // compiler error (as intended)
您必须为该类定义泛型:
data class MyClass<T>(val b: Boolean, val s: String, val flags: Map<Key<T>, T>)
你已经忘记了这个:
data class MyClass<T>(val b: Boolean, // ----------------^ val s: String, val flags: Map<Key<T>, T>)
更多信息: 泛型