我需要创建一个数据类:未解决参考: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
关于如何实现这一点的任何想法?
我需要创建一个数据类:未解决参考: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
关于如何实现这一点的任何想法?
你不能这样做这直接通过类型系统,你将不得不使用封装来确保键和值的类型是一致的。 This problem exists in Java as well.
别人给的解决方案不起作用,因为你只能够把一个类型的键/值到地图会(有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)
或:
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
}
}
:
val map = mutableMapOf<Key<*>, Any?>()
map[Key<String>()] = "blah" // works
map[Key<Int>()] = 3 // works
map[Key<Int>()] = "blah" // works, but is wrong.
你不得不例如写周边的地图总是确保关键你自己封装的值相匹配
(你可以添加一个不可变的超接口,如果你想)
,然后使用这个作为一个字段:
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>)
欲了解更多信息:Generics
什么是'关键“这里? –
在这种情况下,密钥是android.hardware.camera2.CaptureRequest.Key – Mugur