ОК, поэтому Set
инвариантен в параметре типа и работает точно так, как должен
scala> Set(1, 2, 3) contains "Hi"
<console>:8: error: type mismatch;
found : java.lang.String("Hi")
required: Int
Set(1, 2, 3) contains "Hi"
^
Но, как вы говорите:
scala> Map('a -> 1, 'b -> 2, 'c -> 3).values.toSet contains "Hi"
res1: Boolean = false
Единственный вывод, который мыМожно разумно сказать, что тип Set
, о котором идет речь, - , а не Set[Int]
.Что произойдет, если мы явно скажем scala, что мы хотим Set[Int]
?Тот же фрагмент кода с явным параметром типа работает просто отлично (т.е. не компилируется):
scala> Map('a -> 1, 'b -> 2, 'c -> 3).values.toSet[Int] contains "Hi"
<console>:8: error: type mismatch;
found : java.lang.String("Hi")
required: Int
Map('a -> 1, 'b -> 2, 'c -> 3).values.toSet[Int] contains "Hi"
^
Проблема заключается в том, что выводимый параметр типа передается в toSet
метод.Scala, очевидно, принимает во внимание contains "Hi"
и делает вывод, что Int
и String
(то есть Any
)