Scala 地图上的奇怪行为

Scala 地图上的奇怪行为,scala,map,Scala,Map,为什么在上述代码中,res2的类型是Map[有性别的产品,有性别的产品]而不是Map[性别,性别]?为什么在我提供给map的四个条目中,只有两个被添加了?1)Product是Male和Female的最低级别超类。这是因为所有案例类都扩展了Product。两者都有Scala识别的trait性别,所以它也包括了这一点。这是Scala对类型推断的最佳猜测,因为它是最具体的可推断类型(Map[Gender,Gender]更一般)。如果希望类型为Map[Gender,Gender],可以明确地告诉它: s

为什么在上述代码中,
res2
的类型是
Map[有性别的产品,有性别的产品]
而不是
Map[性别,性别]
?为什么在我提供给map的四个条目中,只有两个被添加了?

1)
Product
Male
Female
的最低级别超类。这是因为所有案例类都扩展了
Product
。两者都有Scala识别的trait
性别,所以它也包括了这一点。这是Scala对类型推断的最佳猜测,因为它是最具体的可推断类型(
Map[Gender,Gender]
更一般)。如果希望类型为
Map[Gender,Gender]
,可以明确地告诉它:

scala> sealed trait Gender
defined trait Gender

scala> case object Male extends Gender
defined module Male

scala> case object Female extends Gender
defined module Female

scala> Map(Male -> Male, Female -> Female, Male -> Female, Female -> Male)
res2: scala.collection.immutable.Map[Product with Gender,Product with Gender] =
        Map((Male,Female), (Female,Male))
2) 映射的本质是每个键只有一个值。添加
Male->Male
时,您正在将
Male
映射到
Male
。当您添加
Male->Female
时,您将覆盖原始映射,以便现在
Male
映射到
Female
。如果您想拥有所有这些映射,那么可能更容易只映射到一个对列表,因为这不强制任何唯一性约束

scala> val x: Map[Gender,Gender] = Map(Male -> Male, Female -> Female, Male -> Female, Female -> Male)
x: Map[Gender,Gender] = Map(Male -> Female, Female -> Male)