Map的奇特行为

unk*_*945 3 scala map

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))
Run Code Online (Sandbox Code Playgroud)

为什么在上面的代码中,类型res2是?Map[Product with Gender, Product with Gender]而不是Map[Gender, Gender]?为什么我提供给地图的四个条目,只添加了两个?

dhg*_*dhg 17

1)Product是两者的最低级别的超类MaleFemale.这是因为所有案例类都会扩展Product.两者都有特征Gender,Scala认可,所以它也包括在内.这是Scala的最佳类型推断猜测,因为它是最具体的类型推断出来(Map[Gender,Gender]更普遍).如果你想要类型Map[Gender,Gender],你可以明确告诉它:

scala> val x: Map[Gender,Gender] = Map(Male -> Male, Female -> Female, Male -> Female, Female -> Male)
x: Map[Gender,Gender] = Map(Male -> Female, Female -> Male)
Run Code Online (Sandbox Code Playgroud)

2)Map的本质是每个键只有一个值.添加时,Male -> Male您将映射MaleMale.添加时,Male -> Female您将覆盖原始映射,以便现在Male映射到Female.如果你想拥有所有这些映射,那么仅仅对一个对列表可能更容易,因为它不会强制执行任何唯一性约束.