为什么下面的类型等价成立
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
凭直觉我会期望如果 T = A
和 A = Int
那么 T = Int
?
最佳答案
这是因为 makeFoo
的返回类型只是 Foo
而不是 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
Scastie :
<script src="https://scastie.scala-lang.org/knIfPcXqSQKXXCXJ2teHkg.js"></script>
https://stackoverflow.com/questions/61858945/
相关文章:
typescript - 如何使用可选的唯一字符串定义数组 typescript 接口(interf
swiftui - 我怎样才能在 SwiftUI 中实现类似于 radiogroup 的一种可能选择
forms - 如何判断表单字段在 vue.js 中是否无效
c - 使用 for 循环初始化一个数组,并将最终数组元素的值作为条件(在 C 中)
amazon-web-services - 有没有办法使用 aws cloudformation 更
react-native - React 导航 5(导航到另一个堆栈屏幕)