【发布时间】:2011-10-24 22:18:48
【问题描述】:
编辑:感谢 Derek 指出错误消息的关键部分,我能够提取更多关键部分,它似乎与存在类型有关。如果我在语言参考中正确理解了§3.2.10 Existential Quantification over Values,那么val m: Map[x.type#S, x.type#S] forSome { val x: T } 是val m: Map[t#S, t#S] forSome { type t <: T with Singleton } 的简写。然而在下面的代码中,它们的行为确实不同。
trait Type {
type S
}
class Concrete extends Type {
type S = Double
}
trait BaseWorks {
type T <: Type
val m: t#S forSome { type t <: T with Singleton }
}
class Works extends BaseWorks {
override type T = Concrete
override val m = 0.0
}
trait BaseError {
type T <: Type
val m: x.type#S forSome { val x: T }
}
class Error extends BaseError {
override type T = Concrete
override val m = 0.0
}
精炼BaseWorks 有效,而精炼BaseError 会导致错误error: overriding value m in trait BaseError of type Error.this.x.S forSome { val x: => Error.this.T }; value m has incompatible type。我是否误解了 §3.2.10?
原帖:在下面一段 Scala 代码中,编译器 (2.9.0.1) 产生一个错误,指出方法 f2 不会覆盖 Derived 中的任何内容。
abstract trait Type {
type T1
type T2
type P = (T1, T2)
}
class ConcreteType extends Type {
type T1 = Double
type T2 = Double
}
abstract class Base {
type T <: Type
type TP = T#P
def f1(v: TP): TP
def f2(v: T#P): T#P
def f3(v: T#P): T#P
}
class Derived extends Base {
override type T = ConcreteType
override def f1(v: TP): TP = v
override def f2(v: T#P): T#P = v
override def f3(v: TP): TP = v
}
另一方面,使用代码中显示的完全相同的签名覆盖函数f3 是有效的。我希望这两个函数的行为方式相同。为什么不是这样?
【问题讨论】:
-
使用 Scala 编译器 issues.scala-lang.org/browse/SI-4914 打开错误。
标签: scala abstract-data-type path-dependent-type existential-type