scala - 通过方法类型参数分配给类型成员的值破坏了类型等价性
问题描述
为什么以下类型等价成立
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 = A
和A = Int
then T = Int
?
解决方案
这是因为makeFoo
is 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>
推荐阅读
- javascript - 用两根手指垂直滚动
- excel - excel中的VBA最大日期范围来自访问
- fonts - 不要请求 https://fonts.gstatic.com
- javascript - Post form field in a Modalbox
- javascript - Javascript returning a value from a function
- sql-server - SSRS 2019 - slow rendering of ALL reports
- azure - 如何查找 Azure 映像大小?
- javascript - TypeError: Cannot read property 'requestContent' of undefined
- groovy - Jenkins 库/Groovy 脚本 - 动态包装代码
- asp.net-core - 如何使用 ASP.NET Core 3.1 和 Autofac 中的服务位置解析每个请求项?