2017-07-20 145 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