以下代码无法编译:
trait A[F] {
def find(x: Int): F
def fill(f: F): Unit
}
object TestA {
def test[T <: A[F] forSome { type F }](t: T) =
t.fill(t.find(0))
}
它返回以下编译错误:
test.scala:8: error: type mismatch;
found : (some other)F(in type T)
required: F(in type T)
t.fill(t.find(0))
^
然而下面的代码就很好地符合要求:
trait B[F] {
type R = F
def find(x: Int): R
def fill(f: R): Unit
}
object TestB {
def test[T <: B[F] forSome { type F }](t: T) =
t.fill(t.find(0))
}
我这里有两个问题:
我希望第一段代码能够编译。为什么不呢?
如果第一段代码有充分的理由无法编译,那么出于同样的原因,我希望第二段代码也不会编译。那么如何才能编译成功呢?
其中任何一个都是错误吗?
我不知道编译器为什么要区分这两段代码。基本上,代码无法编译,因为返回的类型find
以及预期的类型fill
不必相同F
,至少如果find
and fill
在两个不同的对象上被调用。
您可以使用以下代码来编译第一段代码:
def test[T <: A[F], F](t: T) =
t.fill(t.find(0))
你可以使第二段代码不编译:
def test[T <: B[F] forSome { type F }](t: T, u: T) =
t.fill(u.find(0))
这应该是一条评论而不是一个答案,但我还没有 50 声望。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)