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是两者的最低级别的超类Male和Female.这是因为所有案例类都会扩展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您将映射Male到Male.添加时,Male -> Female您将覆盖原始映射,以便现在Male映射到Female.如果你想拥有所有这些映射,那么仅仅对一个对列表可能更容易,因为它不会强制执行任何唯一性约束.