据我所知,你要找的概念是“协方差”。只是因为
IntValue
是的子类型
Value
MyExtractor[IntValue]
是的子类型
MyExtractor[Value]
. 默认情况下,这两种类型之间根本没有子类型关系。要创建这样的关系,您需要声明
MyExtractor
关于它的参数是协变的。Scala允许您通过在类型参数声明之前添加“+”来声明协变的类型参数。这称为方差表示法。
sealed abstract class MyExtractor[+Value] extends Extractor[Data, Value] {
}
Extractor
类型提供了一个很好的例子,说明了逆差表示法是有意义的。
abstract class Extractor[-A,+B] {
def extract(d:A):B
def stringRepr(d:A):String
}
这意味着如果
Foo
是的子类型
Bar
Extractor[Bar, Baz]
是的子类型
Extractor[Foo, Baz]
如果你仔细想想,这是有道理的。如果某个对象在传递给某个超类型的实例时可以提取所需的数据,那么根据定义,它在传递给某个子类型的实例时可以提取该数据。相反,如果
福
是的子类型
酒吧
,那么
Extractor[Baz, Foo]
是的子类型
Extractor[Baz, Bar]
. 这也是有道理的。如果你有一个提取器
,您当然可以在任何需要返回
酒吧
.
另外,示例中的所有抽象类都应该声明为traits。只要您的抽象类不需要构造函数参数,将它们声明为traits将为您提供更多的重用机会。