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)