【发布时间】:2013-02-06 03:45:08
【问题描述】:
让 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 推断正确的类型参数?
如果不是,一般的答案是什么?
【问题讨论】:
-
不是答案,但值得注意的是,如果您使用类型指示符而不是类型投影键入
x,它会起作用 - 包括例如object BAR extends Bar; val x: BAR.X = "a"; baz(x). -
另外值得注意的是:你可以让编译器相信你真的确实希望
x被键入为或多或少类似于Bar#X的东西,带有难以置信的丑陋的 @987654335 @. -
看起来很奇怪的用例。为什么要这样做?
-
@JesperNordenberg 用例来自banana-rdf。如果我直接使用
RDFtrait 的子类型,那么我无法从this one 等许多隐式函数中受益。
标签: scala polymorphism type-inference type-projection