:エラーメッセージの重要な部分を指摘してくれたので、重要な部分をもう少し抽出することができたし、Existential Typesのようです。私が理解していると、§3.2.10存在する数値の上の存在量が正しくの場合、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
}
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
につながりながら、BaseWorks
作品の絞り込み。私は§3.2.10を誤解していますか?
オリジナルポスト:Scalaの次のコードでは、コンパイラ(2.9.0.1)はDerived
で何を上書きしますf2
その方法を言って、エラーを生成します。一方
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コンパイラhttps://issues.scala-lang.org/browse/SI-4914でバグを発見しました。 –