Oop 扩展泛型类型
我遇到了一个“简单”的问题。我正在处理文件元数据。我想提供一个只读视图(Oop 扩展泛型类型,oop,scala,type-systems,Oop,Scala,Type Systems,我遇到了一个“简单”的问题。我正在处理文件元数据。我想提供一个只读视图(trait ReadOnly)和一个读写视图(trait ReadWrite)以及getter和setter。每个读写视图必须扩展只读视图 trait ReadOnly trait ReadWrite trait BasicRO extends ReadOnly { def foo: String def bar: Int } class BasicRW extends ReadWrite with Basi
trait ReadOnly
)和一个读写视图(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 = ???
}
到目前为止还不错。但是现在,我想在ReadWrite
中添加一个snapshot
方法,它将返回相应的ReadOnly
视图(与ReadWrite
子类扩展的视图相同)。在pseudo scala中,我想将此约束定义为:
trait ReadWrite[T <: ReadOnly] extends T {
def snaphsot: T
}
trait ReadWrite[T需要明确的是,您希望快照位于单独的trait中,但它只能用于同时扩展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
这不会使ReadWrite
扩展ReadOnly
,但它同时要求基对象也混合在ReadOnly
中(使用相同的类型参数)并允许ReadWrite
访问ReadOnly
的方法,同时允许将这两个特性完全独立地子类化。请澄清,您希望快照位于单独的特性中,但它只能用于同时扩展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
这不会使ReadWrite
扩展ReadOnly
,但它同时要求基对象也混合在ReadOnly
中(使用相同的类型参数)并允许ReadWrite
访问ReadOnly
的方法,同时允许将这两个特征完全独立地进行子分类。关于我的答案(我现在已经删除了该答案),您的回答部分正确-我确实在REPL中检查了它,它似乎在那里工作得很好,但更广泛的检查表明我误解了输出。好的,我将删除对已删除解决方案的引用谢谢。添加约束trait ReadOnly[T@itsbrough,因为snapshot
返回的类型T
也必须是ReadOnly
。另一种方法是更改snapshot
签名以返回ReadOnly[T]
而不是T
。哦,你在这里混淆了两个不同的东西。我想知道,在你的问题中,为什么ReadWrite是泛型的,而其他类和特征不是。泛型不是这样工作的。你不能以这种方式将ReadWrite[T]混合到ReadOnly的子类中-即[T]不是指特质中的班级混合。关于我的答案(我现在已经删除了),你部分是对的-我确实在REPL中检查了它,它似乎在那里工作得很好,但更广泛的检查表明我误解了输出。好的,我将删除对已删除解决方案的引用谢谢。添加约束trait ReadOnly[T@itsbrough,因为snapshot
返回的类型T
也必须是ReadOnly
。另一种方法是更改snapshot
签名以返回ReadOnly[T]
而不是T
。哦,你在这里混淆了两个不同的东西。我想知道,在你的问题中,为什么ReadWrite是泛型的,而其他类和trait不是。泛型不是这样工作的。你不能以这种方式将ReadWrite[T]混合到ReadOnly的子类中,即[T]不指在trait中混合的类。