Scala 路径相关参数类型未强制(?)

Scala 路径相关参数类型未强制(?),scala,path-dependent-type,Scala,Path Dependent Type,在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) 这让我非常困惑,因为Outter.f()有一个显式的路径依赖类型参数(x:this.internal),这意味着只允许那些左Lefts(或右Rights)是o.internal的子类型,而不仅仅是任何Le

在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)
这让我非常困惑,因为
Outter.f()
有一个显式的路径依赖类型参数(
x:this.internal
),这意味着只允许那些
Left
s(或
Right
s)是
o.internal
的子类型,而不仅仅是任何
Left[Int,
Right[Int,
。我希望看到一个类型不匹配错误:

必需
o.Inner
,找到
左[Int,Nothing]


但它编译得很好!我(严重)遗漏了什么?

type internal=或者[Int,String]
只是一个类型别名。这是预期的行为

只允许那些属于
o.Inner
的(子类型)的左(或右),而不仅仅是任何
Left[Int,
Right[Int,


只有一个
Left
类和一个
Right
类。没有任何
Left
s或
Right
s仅是
o.Inner
的子类型,而没有其他类型。创建类型别名不会创建仅属于类
Outter
的新类型。
Outter
唯一独特的是别名
internal
,但是
other
是相同的
scala.util。other
type internal=other[Int,String]
只是一个类型别名。这是预期的行为

只允许那些属于
o.Inner
的(子类型)的左(或右),而不仅仅是任何
Left[Int,
Right[Int,


只有一个
Left
类和一个
Right
类。没有任何
Left
s或
Right
s仅是
o.Inner
的子类型,而没有其他类型。创建类型别名不会创建仅属于类
Outter
的新类型。
Outter
唯一独特的是别名
internal
,但是
other
是相同的
scala.util。other

也可以,也可以查看(原始)相关问题,也可以查看后续内容,也可以查看(原始)相关问题,看到后续内容了吗?没有办法从已经定义的类型创建路径依赖的类型?我相信我已经严重偏离了这里的图表:不完全正确。您是否可以尝试包装这些类型?我不知道你为什么想要这样的东西。我的印象是,
类型
别名可以让我省去(重新)实现依赖于封闭值(即路径依赖)的
的麻烦。现在我明白了
type
只是一个别名=与封闭对象无关。那么,我如何实现“包装”呢?由于
other
是密封的…为什么不创建一个包含other
case类Inner(Inner:other[Int,String])
的case类呢?那么就没有办法从已经定义的类型创建路径依赖的类型了?我相信我在这里已经严重偏离了图表:不完全正确。您是否可以尝试包装这些类型?我不知道你为什么想要这样的东西。我的印象是,
类型
别名可以让我省去(重新)实现依赖于封闭值(即路径依赖)的
的麻烦。现在我明白了
type
只是一个别名=与封闭对象无关。那么,我如何实现“包装”呢?由于
or
是密封的……为什么不创建一个包含or
case类内部(内部:or[Int,String])的case类呢
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