Невозможно добавить элемент в карту с использованием типа динамической примеси для ключа

Следующий оператор компилируется нормально и работает должным образом:

val map : Map[_ >: Int with String, Int] = Map(1 -> 2, "Hello" -> 3)

Однако , если я попытаюсь добавить на карту:

map + ((3,4))

или

map + (("Bye", 4))

, то я получу несоответствие типа:

found: java.lang.String ("Bye")

required: _ $ 1, где type _ $ 1 >: Int with String

Если я ослаблю сигнатуру типа, чтобы разрешить Any в качестве типа ключа, тогда все это будет работать, как ожидалось.

Моя интуиция подсказывает, что это связано с невариантностью типа ключа Map и что _ $ 1 каким-то образом фиксируется как особый супертип Int с String , но я не особо доволен это. Кто-нибудь может объяснить, что происходит?

Отредактировано для добавления:

Если вам интересно, где это возникает, это подпись, которую вы получите, если сделаете что-то вроде:

val map = if (true) Map(1 -> 2) else Map("1" -> 2)
6
задан Didier Dupont 6 January 2012 в 17:58
поделиться