你不能以这种方式继承。它违反了里氏替换原则。我会说明为什么会这样。假设您可以编译这些类:
class Person {
def doSomething[P<%Person](persons :List[P]) {
}
}
class Worker extends Person {
override def doSomething(persons: List[Worker]) {
}
}
现在,这个简单的程序会失败:
val p1: Person = new Worker
val p2: Person = new Person
p1.doSomething(List(p2))
由于p2
不是 a Worker
,因此该调用无效。但是,既然p1
是 a Person
,那么该调用是有效的!这种矛盾是您提出的覆盖的结果。
但比这更糟糕!这也不起作用:
p1.doSomething[Worker](List(p1))
现在,即使它传递了一个工人列表,正如预期的那样p1
,它失败了,因为doSomething
inWorker
不需要类型参数。但是,声明应该传递类型参数的doSomething
方法Person
!同样,矛盾是您建议的覆盖的结果。
请记住,继承是一种is-a关系。如果Worker
是 a Person
,那么它应该在人们期望 a 的所有方面表现得像a 。如果这不是您想要创建的那种关系,那么不要使用继承。Person
Person