Вы не можете наследовать таким образом.Это нарушает принцип замещения Лискова .Я покажу, почему это так.Предположим, что вы можете скомпилировать эти классы:
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
не является Worker
, этот вызов недопустим.Однако, поскольку p1
является Person
, этот вызов действителен!Это противоречие является результатом предложенного вами переопределения.
Но это еще хуже!Это ТАКЖЕ не сработает:
p1.doSomething[Worker](List(p1))
Теперь, несмотря на то, что он пропускает список работников, как и ожидалось p1
, он не работает, потому что doSomething
в Worker
не работаетНе ожидайте параметр типа .Однако метод doSomething
из Person
объявил, что параметр типа должен быть передан!Опять же, противоречие является результатом предложенного вами переопределения.
Помните, что наследование - это тип отношений is-a .Если Worker
- это Person
, то он должен действовать как Person
во всех отношениях, ожидая, что Person
будет действовать.Если вы не хотите создавать такие отношения, не используйте наследование.