我试图让以下代码工作:
abstract class Vec[Self <: Vec[Self,T], T] {
this : Self =>
def *(y : Self) : Self
}
abstract class LA[T] {
type V <: Vec[V, T]
}
object typetest2 {
def doesntcompile[L <: LA[Double]](x : L#V, y : L#V) : Unit = {
val z = x * y
}
def compiles[V <: Vec[V,_]](x : V, y : V) : Unit = {
val z = x * y
}
}
但是编译器给出了
[error] found : y.type (with underlying type L#V)
[error] required: _9.V
[error] val z = x * y
[error] ^
这是类型检查器的失败还是我做错了什么?
答案 0 :(得分:2)
虽然我不确定这种特殊情况没有解决方法,但编译器通常不会告诉两个路径相关的类型,即使它们是相同的。
您通常可以通过添加其他类型参数来解决此类问题:
def compiles2[V1 <: Vec[V1, _], L <: LA[Double]{type V = V1}](x: L#V, y: L#V) = {
val z = x * y
}
在某些情况下,您可能需要使用隐式=:=
或Leibniz
(Scalaz)来让编译器传递两种类型在链中相等的证据。