Как определить карту с определенным ключом типа и любым значением отдельного типа в Scala? - PullRequest
0 голосов
/ 23 февраля 2012

Что мне нужно, это что-то вроде

Map[DateTime, Any]

но все значения должны быть любого одного определенного типа . Например, это не значит, что одно значение - Int, другое - Double, а третье - String - все записи должны быть одного и того же конкретного типа, пониженного до Any.

Я собираюсь взять карту в качестве аргумента функции, не зависящей от типа, определить тип с помощью соответствия / регистра и выполнить определенный алгоритм. Функция фактически поддерживает некоторые типы и выдает исключение, если предоставленный тип не поддерживается.

1 Ответ

1 голос
/ 23 февраля 2012

Я не уверен, что вы хотите;Вы, кажется, хотите что-то, что почти точно, что делают дженерики, но очевидно с некоторой разницей в деталях, которые я не понял.Так что я думаю:

Если вы жалуетесь, что 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 связаны с тем, что находится на карте, до того, как оно достигнет второго блока параметров.Так что вам не придется беспокоиться о противоречивости типа значения карты.

...