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 = A和A = Int然后T = Int?
这是因为 的返回类型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)
| 归档时间: |
|
| 查看次数: |
81 次 |
| 最近记录: |