Неразрешенная ссылка: T

Мне нужно создать класс данных:

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

Это не скомпилируется из-за «неразрешенной ссылки: T»

На карте flags мне нужно иметь Key<String>, String и Key<Int>, Int пары, но NOT 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>) 

Дополнительная информация: Generics

Intereting Posts
Android Studio 3.0 "JUnit версии 3.8 или более поздней версии" Почему этот объект Котлин может наследовать от себя? Смешивание Java и проекта Kotlin In Gradle, Kotlin не может найти Java-класс Зачем получать класс в Котлин, используя двойную двоеточие (: :)? Могу ли я передать информацию о типе, чтобы упростить это? Kotlin by Lazy в пользовательских представлениях Ленивая инициализация свойства класса Kotlin не будет компилироваться Как издеваться над объектом Котлина с помощью Mockito / PowerMockito? Требуется <Объект> и найден <Объект>? 2D-массив в Котлине Kotlin, когда несколько значений не работают, когда значение представляет собой вид android Получение доступа к экземпляру в функции обертки Kotlin: установка частного булева класса Java через класс Data в Котлине. Почему я не могу это сделать? Как вы объявляете полиморфное поле, которое использует JsonTypeInfo.As.WRAPPER_OBJECT с Jackson XML? Измените значение глобальной переменной из внутреннего класса