与路径相关的参数类型未强制执行(?)

时间:2016-02-22 15:33:38

标签: scala path-dependent-type

has___()

尝试了REPL:

class Outter {
  type Inner = Either[Int, String]

  def f(x: this.Inner) = 1
}

val o = new Outter
val someLeft = Left(1)
o.f(someLeft)

由于scala> :load Learn.scala Loading Learn.scala... defined class Outter o: Outter = Outter@28037ced someLeft: scala.util.Left[Int,Nothing] = Left(1) res0: Int = 1 具有明确的路径依赖类型参数(Outter.f()),这意味着那些x: this.Inner(或者允许Left({1}}的(子类型),只有Righto.Inner。我希望看到类型不匹配错误:

必填Left[Int,_],找到Right[Int,_]

但它只编译好!我(很难)在这里失踪了什么?

1 个答案:

答案 0 :(得分:3)

type Inner = Either[Int, String]只是一种类型别名。这是预期的行为。

  

只允许那些({1}}的(子类型)左派(或权利),而不仅仅是o.InnerLeft[Int, _]

分别只有一个Right[Int, _]和一个Left类。没有RightLeft 是<{1}}的子类型而没有其他内容。创建类型别名不会创建仅属于类Right的新类型。 o.Inner唯一独有的是别名Outter,但Outter与旧版Inner相同。