我在让 Scala 从类型投影中推断出正确的类型时遇到了一些麻烦。
考虑以下:
trait Foo {
type X
}
trait Bar extends Foo {
type X = String
}
def baz[F <: Foo](x: F#X): Unit = ???
然后以下编译正常:
val x: Foo#X = ???
baz(x)
但以下不会编译:
val x: Bar#X = ???
baz(x)
Scala 看到
x
的“底层类型字符串” ,但是丢失了x
的信息是 Bar#X
.如果我注释类型它工作正常:baz[Bar](x)
有没有办法让 Scala 为
baz
推断正确的类型参数?如果不是,那么使之成为不可能的一般答案是什么?
最佳答案
程序通过在上下文中添加这个隐式转换来编译:
implicit def f(x: Bar#X): Foo#X = x
由于此隐式转换适用于任何
F <: Foo
,我想知道为什么编译器自己不这样做。
关于scala - 如何从投影类型推断正确的类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14721127/