Scala类型问题

问题描述

| 我想创建一个不可变的集合(如collection)和一个可变的对象。它们都共享一些不变性相同的部分。 也许我应该深入研究一下Scala集合的实现方式,但是我并没有尝试创建完整的集合类型。 我现在有这个,但是感觉不太正确。
trait StyleMapping[T <: Style[T]] {
  type Mappings <: scala.collection.Map[Option[String],T]
  val mappings: Mappings

  def get(classNames: List[String]): Option[T] = {
    mappings.get(...) // Do something here.
  }
}
这是一个不变实现的示例:
class ImmutableStyleMapping[T <: Style[T]](
    val mappings: Map[Option[String],T)
  extends StyleMapping[T] {
  type Mappings = Map[Option[String],T]
}
这可行,但是感觉就像我在代码中重复了所有类型。抽象类型是最好的方法吗,还是应该以不同的方式进行设计?非常感谢您能以不同的方式对此有所了解。     

解决方法

鉴于您在此处显示的内容,我认为您不需要使用抽象类型。您的
StyleMapping
特征实现必须与通用
Map
一起使用。只有子类才会关心地图是不可变的还是可变的。考虑到这一点,可以将其简化为:
trait StyleMapping[T <: Style[T]] {
  val mappings: collection.Map[Option[String],T]
  def get(classNames: List[String]): Option[T] = {
    mappings.get(...) // Do something here.
  }
}

class ImmutableStyleMapping[T <: Style[T]](
  val mappings: Map[Option[String],T]) extends StyleMapping[T]

class MutableStyleMapping[T <: Style[T]](
  val mappings: collection.mutable.Map[Option[String],T]) extends StyleMapping[T]
在每种情况下,“ 5”都将具有所需的不可变或可变属性,这将由编译器强制执行。