未解决的参考: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

任何想法,我怎么能做到这一点?

你不能直接通过类型系统来做到这一点,你将不得不使用封装来确保键和值的类型是一致的。 这个问题也存在于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>) 

你已经忘记了这个:

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

更多信息: 泛型