Это не особенно разработан вообще;или это так, но не так, как вы думаете.Вы не переопределяете def AA()
с помощью метода, который создает AA
, вы переопределяете его самим object AA
.Обратите внимание
trait T {
type I <: AnyRef
def I(): AnyRef
}
object O extends T {
case class I(val i: Int)
}
Это прекрасно работает.
> (O: T).I()
I
> (O: T).I().getClass
class O$I$
> O.I(5)
I(5)
> O.I(5).getClass
class O$I
Существенными вариантами дизайна являются "object
s может переопределить без параметров def
s" (и так может val
s, var
s и, конечно, без параметров def
s) и "case class
es автоматически генерируют object
s".«Внутренние case class
переопределяют методы с одинаковыми именами во внешнем классе с помощью своих конструкторов», это не одно из правил Scala.object O
содержит case class I
и object I
, а реферат def I(): AnyRef
переопределяется для возврата указанного object I
.Содержимое object I
не имеет значения, потому что def I()
должно возвращать только AnyRef
, что означает, что никаких ограничений не накладывается.Тогда совершенно логично, что
trait U {
type I <: AnyRef
def I(i: Int): AnyRef
}
object P extends U {
case class I(i: Int)
}
терпит неудачу.object P
содержит case class I
и связанный object I
, но ему также нужен def I(i: Int): AnyRef
, которого ему не хватает.