我遇到了一个“简单”的问题。我正在使用文件元数据。我想提供一个只读视图(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类型系统中表达这种约束?
答案 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
的方法,同时允许两个特征完全独立于彼此。