Следующий оператор компилируется нормально и работает должным образом:
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)