为什么 scala self 类型不是其要求的子类型

Kre*_*ver 3 inheritance scala self-type subtyping

我想知道以下行为背后的原因是什么?

@ trait Bar
defined trait Bar

@ trait Foo { self: Bar => }
defined trait Foo

@ def x: Foo = ???
defined function x

@ val y: Bar = x
cmd3.sc:1: type mismatch;
 found   : ammonite.$sess.cmd1.Foo
 required: ammonite.$sess.cmd0.Bar
val y: Bar = x
             ^
Compilation Failed
Run Code Online (Sandbox Code Playgroud)

AFAIU,Foo要求其每个子类型都是 的子类型,Bar那么为什么实例Foo不是 的正确实例Bar

@编辑

只是为了让问题更清楚:我想知道为什么它会这样工作。一些可能的答案是:

  1. 有一些特征 X 在它们之间的子类型关系中是不可能的。
  2. 发生子类型关系是不正确的(例如,存在这样的类型实例,Foo而不是Bar运行时类型的实例)
  3. 这两种情况(有和没有子类型关系)都是有效的,因此编译器团队必须选择其中之一。如果是这样,是否有理由做出这样的决定还是随机选择?

似乎至少 1) 有点正确(隐藏子类型作为实现细节)。

Mat*_*ndt 6

因为 selftype 是Footrait的实现细节。您可能希望Foo根据从 继承的方法来实现的方法Bar,但不要向 API 的用户公开该事实。