2017-07-20 194 views
0

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

關於如何實現這一點的任何想法?

+0

什麼是'關鍵「這裏? –

+0

在這種情況下,密鑰是android.hardware.camera2.CaptureRequest.Key – Mugur

回答

2

你不能這樣做這直接通過類型系統,你將不得不使用封裝來確保鍵和值的類型是一致的。 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) 
+0

我已經開始研究與你的建議非常相似的東西了。我會讓你知道結果如何。 – Mugur

+0

我結束了使用這個解決方案。謝謝! – Mugur

3

必須定義爲通用類:

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

我覺得這不起作用。如果我有MyClass ,是不是允許一個'鍵,Int'對? – Mugur

+0

@Mugur'T'是不變的,所以不... ...此外,你不能測試它嗎?如果你有'flags:Map ,T>' – Moira

0

你忘了這一點:

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

欲瞭解更多信息:Generics