扩展泛型类型

时间:2013-09-11 08:39:42

标签: oop scala type-systems

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

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子类扩展相同)。在伪scala 中,我想将此约束定义为:

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

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

1 个答案:

答案 0 :(得分:4)

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

您可以使用自我类型

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

这不会使ReadWrite扩展ReadOnly,但它都要求基础对象也混合在ReadOnly(具有相同的类型参数)并给出{{1}访问ReadWrite的方法,同时允许两个特征完全独立于彼此。