W przypadku listy, bez deklaracji typu, Scala przegląda wszystkie elementy i próbuje znaleźć typ wspólny. W twoim przypadku, ponieważ Int może zostać przekonwertowany na Double, konwertuje twoją mieszaną listę na listę [Double] promującą twój jeden Int.
Konstruktor map pobiera serię 2-krotnych. co można uzyskać takie samo zachowanie, jeśli tylko skonstruowane listę krotek:
scala> List((1, "one"), (2.0, "two.oh"))
res0: List[(AnyVal, String)] = List((1,one), (2.0,two.oh))
Tuple2 [Int, String] nie może automatycznie być promowany do Tuple2 [Double, String]. W tym przypadku trzeba pomóc kompilator się nieco z deklaracją typu:
scala> val x: List[(Double, String)] = List((1, "one"), (2.0, "two.oh"))
x: List[(Double, String)] = List((1.0,one), (2.0,two.oh))
lub
scala> val x = List[(Double, String)]((1, "one"), (2.0, "two.oh"))
x: List[(Double, String)] = List((1.0,one), (2.0,two.oh))
lub w przypadku:
scala> val x = List[(Double, String)]((1, "one"), (2.0, "two.oh")).toMap
x: scala.collection.immutable.Map[Double,String] = Map(1.0 -> one, 2.0 -> two.oh)
Dla jakiegoś powodu , używanie deklaracji typu na mapie nie działa. Nie wiem, dlaczego:
scala> val x = Map[Double, String](1 -> "one", 2.0 -> "two.oh")
<console>:7: error: type mismatch;
found : (Int, String)
required: (Double, String)
val x = Map[Double, String](1 -> "one", 2.0 -> "two.oh")
Możliwość powtórnego odtworzenia również w wersji 2.9.2. –