Я не уверен, что вы хотите;Вы, кажется, хотите что-то, что почти точно, что делают дженерики, но очевидно с некоторой разницей в деталях, которые я не понял.Так что я думаю:
Если вы жалуетесь, что add of maps может расширить тип значений:
scala> val m = Map(5 -> "fish")
m: scala.collection.immutable.Map[Int,java.lang.String] = Map(5 -> fish)
scala> m + ("foo" -> "dish") // Type mismatch on key
<console>:9: error: type mismatch;
found : (java.lang.String, java.lang.String)
required: (Int, ?)
m + ("foo" -> "dish")
scala> m + (2 -> 44) // Type mismatch on value
m + (2 -> 44)
res2: scala.collection.immutable.Map[Int,Any] = Map(5 -> fish, 2 -> 44)
, тогда вы можете использовать обобщенные значения и множественные аргументы, чтобы помешать изменениям типазначения в предоставляемых вами методах:
def add[A,B](m: Map[A,B])(a: A, b: B) = m + (a -> b)
scala> add(m)(2, 44)
<console>:10: error: type mismatch;
found : Int(44)
required: java.lang.String
add(m)(2, 44)
Здесь типы A
и B
связаны с тем, что находится на карте, до того, как оно достигнет второго блока параметров.Так что вам не придется беспокоиться о противоречивости типа значения карты.