如何在Scala中定义具有特定类型键和任何单一类型值的映射?

如何在Scala中定义具有特定类型键和任何单一类型值的映射?,scala,map,scala-collections,Scala,Map,Scala Collections,我需要的是 Map[DateTime, Any] 但所有值必须是任何一种特定类型。例如,一个值不能是Int,另一个值不能是Double,第三个值不能是String——所有记录都必须是相同的特定类型,并向下转换为Any 我将把map作为一个参数引入一个半类型不可知函数,用match/case确定类型,并执行一个特定的算法。该函数实际上将支持某些类型,如果所提供的类型不受支持,则会引发异常。我不确定您想要什么;你似乎想要的东西几乎完全是泛型所做的,但显然在细节上有些不同,我还不明白。所以我猜: 如

我需要的是

Map[DateTime, Any]
但所有值必须是任何一种特定类型。例如,一个值不能是Int,另一个值不能是Double,第三个值不能是String——所有记录都必须是相同的特定类型,并向下转换为Any


我将把map作为一个参数引入一个半类型不可知函数,用match/case确定类型,并执行一个特定的算法。该函数实际上将支持某些类型,如果所提供的类型不受支持,则会引发异常。

我不确定您想要什么;你似乎想要的东西几乎完全是泛型所做的,但显然在细节上有些不同,我还不明白。所以我猜:

如果您抱怨“地图添加”会扩大值的类型:

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)
scala>valm=Map(5->“鱼”)
m:scala.collection.immutable.Map[Int,java.lang.String]=Map(5->fish)
scala>m+(“foo”->“dish”)//键上的类型不匹配
:9:错误:类型不匹配;
找到:(java.lang.String,java.lang.String)
必填项:(Int,?)
m+(“foo”->“dish”)
scala>m+(2->44)//值上的类型不匹配
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)
def add[A,B](m:Map[A,B])(A:A,B:B)=m+(A->B)
scala>添加(m)(2,44)
:10:错误:类型不匹配;
发现:Int(44)
必需:java.lang.String
加(m)(2,44)

这里,
A
B
的类型在到达第二个参数块之前绑定到映射中的任何对象。因此,您不必担心映射值类型的逆变。

我知道泛型,但在这种情况下,我不想要
def semiAgnostic[A](m:map[DateTime,A])
。我想要
def半不可知(m:Map[DateTime,A]):Map[DateTime,B]
其中A将在函数内部自动检测,B将在任何进一步消耗结果的函数内部自动检测。使用match/case对Any进行专门化使这种方法成为可能,但在这种情况下,
Map[DateTime,Any]
将允许引入意外的集合(同时总是希望尽可能强烈地约束输入)。API使用者只需将函数称为
半不可知函数(in:Map[DateTime,Int])即可使用该函数
半不可知(in:Map[DateTime,Double])
半不可知(in:Map[DateTime,SomeCutomClass])
而不指定值类型为[A]。这是一个可用性问题:DSL需要尽可能的可读性和无冗余性,因为受众不受编程经验要求的限制。我很好奇类型是否可以用作参数,而不是说明符
Something[A]
Something[B]
和简单的
Something
是不同的类型,而不是一个以类型说明符作为属性的类型,这似乎极大地限制了灵活性。Scala的类型推断将在您的示例中推断出A。@Ivan-您的评论对我来说没有意义,如果我们说的是Scala,至少不会。你可能误解了什么,但我不能肯定。你似乎抱怨说你不想要泛型,因为你想要的是像泛型一样工作的东西,API使用者必须能够用泛型调用函数,除了你认为泛型是个问题之外,我打赌一些巧妙的使用泛型会导致编译器错误,而不是运行时错误。