簡體   English   中英

未解決的參考:T

[英]Unresolved reference: T

我需要創建一個數據類:

data class MyClass(val b: Boolean,
               val s: String,
               val flags: Map<Key<T>, T>)

由於“未解析的引用:T”,因此無法編譯

flags圖中,我需要具有Key<String>, StringKey<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM