我需要創建一個數據類:未解決參考: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