通过方法类型参数分配给类型成员的值打破了类型等价性

Mar*_*lic 2 scala type-equivalence type-parameter type-members

为什么以下类型等价成立

trait Foo { type T }
val fa = new Foo { type T = Int }

implicitly[fa.T =:= Int] // OK
Run Code Online (Sandbox Code Playgroud)

但是当类型成员T通过方法参数分配时,A类型等价不成立

def makeFoo[A]: Foo = new Foo { type T = A }
val fb = makeFoo[Int]

implicitly[fb.T =:= Int] // ERROR
Run Code Online (Sandbox Code Playgroud)

直觉上我希望如果T = AA = Int然后T = Int

use*_*ser 6

这是因为 的返回类型makeFoo是 onlyFoo而不是Foo { type T = A }。如果你没有明确声明它或者你改进它,错误就会消失。

def makeFoo[A] = new Foo { type T = A }
val fb = makeFoo[Int]

implicitly[fb.T =:= Int] // No more error

or

def makeFoo2[A]: Foo { type T = A } = new Foo { type T = A }
val fc: Foo { type T = Int } = makeFoo[Int]

implicitly[fc.T =:= Int] // No more error
Run Code Online (Sandbox Code Playgroud)

斯卡斯蒂

def makeFoo[A] = new Foo { type T = A }
val fb = makeFoo[Int]

implicitly[fb.T =:= Int] // No more error

or

def makeFoo2[A]: Foo { type T = A } = new Foo { type T = A }
val fc: Foo { type T = Int } = makeFoo[Int]

implicitly[fc.T =:= Int] // No more error
Run Code Online (Sandbox Code Playgroud)