1

我被一个“简单”的问题困住了。我正在处理文件元数据。我想提供一个trait ReadOnly只有 getter 的只读视图 ( ) 以及一个trait ReadWrite带有 getter 和 setter 的读写视图 ( )。每个读写视图都必须扩展一个只读视图。

trait ReadOnly 

trait ReadWrite

trait BasicRO extends ReadOnly {
  def foo: String
  def bar: Int
}

class BasicRW extends ReadWrite with BasicRO {
  def foo: String = ???
  def foo_=( str: String ): Unit = ???
  def bar: Int = ???
  def bar_=( i: Int ): Unit = ???
}

到目前为止,一切都很好。但是现在,我想添加一个snapshot方法,ReadWrite该方法将返回相应的ReadOnly视图(与ReadWrite子类扩展的相同)。在pseudo-scala中,我想将此约束定义为:

trait ReadWrite[T <: ReadOnly] extends T {
  def snaphsot: T
} 

但它不能编译,因为class type required but T found(编译器消息)。有没有办法在 Scala 类型系统中表达这个约束?

4

1 回答 1

4

为了清楚起见,您希望快照处于单独的特征中,但它只能在也扩展 ReadOnly 的类中使用?

您可以为此使用 self 类型

trait ReadOnly[T]

trait ReadWrite[T] { self: ReadOnly[T] => 
   def snapshot: T
}

trait BasicRO[T] extends ReadOnly[T] {
  def foo: String
  def bar: Int
}

abstract class class1[T] extends ReadOnly[T] with ReadWrite[T]  // legal

abstract class class2[T] extends ReadWrite[T] // Not legal

abstract class class3[T] extends BasicRO[T] with ReadWrite[T] // legal

这不会产生ReadWriteextend ReadOnly,但它都要求基对象也混合 a ReadOnly(具有相同的类型参数)并允许ReadWrite访问ReadOnly的方法,同时允许两个特征完全独立地进行子类化。

于 2013-09-11T10:13:53.400 回答