首页 > 解决方案 > 通过方法类型参数分配给类型成员的值破坏了类型等价性

问题描述

为什么以下类型等价成立

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

implicitly[fa.T =:= Int] // OK

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

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

implicitly[fb.T =:= Int] // ERROR

直觉上我会期待 ifT = AA = Intthen T = Int

标签: scalatype-parametertype-memberstype-equivalence

解决方案


这是因为makeFoois onlyFoo和 not的返回类型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

斯卡斯蒂

<script src="https://scastie.scala-lang.org/knIfPcXqSQKXXCXJ2teHkg.js"></script>


推荐阅读