我正在尝试从一个密封特质的实例定义一个映射。在下面的代码中,Scala似乎会将键类型推断为Product with Serializable with Day
:
object Test extends App {
sealed trait Day
case object Sunday extends Day
case object Monday extends Day
case object Tuesday extends Day
val m: Map[Day, Int] = Map(Sunday -> 17, Monday -> 4).withDefaultValue(0)
}
这段代码无法编译:
Test.scala:7: error: type mismatch;
found : scala.collection.immutable.Map[Product with Serializable with Test.Day,Int]
required: Map[Test.Day,Int]
Note: Product with Serializable with Test.Day <: Test.Day, but trait Map is invariant in type A.
You may wish to investigate a wildcard type such as `_ <: Test.Day`. (SLS 3.2.10)
val m: Map[Day, Int] = Map(Sunday -> 17, Monday -> 4).withDefaultValue(0)
我可以在m
的定义中更改键类型,但这意味着需要在多个地方重复使用Product with Serializable with Day
。我找到的另一种选择是更改特质的定义为:
sealed trait Day extends Product with Serializable
由于使用封闭特征和case对象而不是枚举有许多优点,因此我想知道在地图中将它们作为键的好方法是什么。
Product
和Serializable
中定义的属性,所以Scala会隐式地创建匿名类,该类扩展了您的类,并提供了equals
和hash
的默认实现。 - sarveshserival m: Map[Day, Int] = Map[Day, Int](Sunday -> 17, Monday -> 4).withDefaultValue(0)
。 - Rüdiger Klaehn