[英]Unresolved reference: 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
關於如何實現此目標的任何想法?
您必須為該類定義泛型:
data class MyClass<T>(val b: Boolean,
val s: String,
val flags: Map<Key<T>, T>)
您不能直接通過類型系統執行此操作,必須使用封裝以確保鍵和值的類型一致。 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>)
有關更多信息: 泛型
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.