Scala 类型成员的多次重写

Scala 类型成员的多次重写,scala,types,Scala,Types,让我们看一下简化的代码: class Base { self => type Actual <: Base {type Actual = self.Actual} def me: Actual = this.asInstanceOf[Actual] } class A extends Base { override type Actual = A } class B extends A { override type Actual = B } printl

让我们看一下简化的代码:

class Base {
  self =>
  type Actual <: Base {type Actual = self.Actual}

  def me: Actual = this.asInstanceOf[Actual]
}

class A extends Base {
  override type Actual = A
}

class B extends A {
  override type Actual = B
}

println((new B).me)

如何实现所需的行为以及为什么它会在第二个类型成员重写上崩溃?

这通常是通过f有界多态性实现的

class Base[Actual <: Base[Actual]] {   
  def me: Actual
}

class A extends Base[A]

class B extends Base[A]

@弗拉维安的回答是正确的。有关此类多重重写不起作用的原因,请查看此讨论

特别是这一点:

若要重写类成员,必须指定重写的类型 “subsume”重写成员的类型。(规范第5.1.4节)

对于类型别名,“subsume”意味着它们必须是等效的。(规格 第3.5.2节,靠近末端。)

因此,您可以编写此代码,因为type
A
显然等同于ot
A

class B extends A {
  override type Actual = A
}

但是类型
A
B
是不等价的,这就是为什么不能用类型
B
覆盖类型
A
,你可以使用
self.type
,而不是定义类型成员感谢解释,我认为类型参数和类型成员具有相同的“能力”。如果我不能通过类型成员来表达f-有界多态性,情况似乎就不是这样了:-/。谢谢你的解决方案,我错误地认为类型参数和成员具有相同的能力,所以我试图通过类型成员来表达它(我更喜欢它们,但现在我知道我必须使用类型参数)。当
B
扩展
A
时,如何实例化
A
?您需要提供一个类型参数,通常在这种情况下,您不需要实例化
A
。根类应该包含关于
A
B
的足够信息,但我不知道您的具体情况。
class A[Actual <: Base[Actual]] extends Base[Actual]
class B extends A {
  override type Actual = A
}