紛らわしいタイトルに申し訳ありません。同じ基本クラスを持つクラスの型メンバーをオーバーライドするにはどうすればよいですか?
Request
とResponse
のクラスを検証および解析の目的で作成しようとしています。コンパイル時に型の保証をしたいが、実行時の多形性はまだある。私は、次の基本クラスを有する:Json.parse(responseString).as[request.ResponseType]
:私はタイプ_ <: Request
のインスタンスを持っている場合
abstract class Response()
abstract class Request() {
type ResponseType = Response
def ResponseClass: Class[_ <: ResponseType] = classOf[ResponseType]
}
ので、私が正しいタイプで、例えばJSON応答を、解析することができます。
私は、これらのクラスを拡張するとき、私はResponseType
override
することができませんことを見つける:
case class AddedFooResponse() extends Response
case class AddFooRequest() extends Request {
override type ResponseType = AddedFooResponse
}
error: overriding type
ResponseType
in classRequest
, which equalsthis.Response
; typeResponseType
has incompatible typeoverride type ResponseType = AddedFooResponse
タイプに互換性がない、なぜ私はわかりませんよ。
abstract class Response()
abstract class Request() {
type ResponseType <: Response
// cannot initialize because no concrete class
def ResponseClass: Class[_ <: ResponseType]
}
と単にResponseType
とResponseClass
の両方を無効にする:私の現在の回避策は、基本クラスでタイプをバインドするためにされ、ビット不器用です
case class AddedFooResponse() extends Response
case class AddFooRequest() extends Request {
override type ResponseType = AddedFooResponse
override def ResponseClass = classOf[ResponseType]
}
これは一見(の多くを必要と)ResponseClass
を無効にするための不要なボイラープレート。
私は間違って何をしていますか?
なぜあなたはそのような方法で 'ResponseType'のクラスを保存する必要がありますか? java.lang.Classを必要としない、必要なものを実現するためのより良い方法があるかもしれないと私は感じています。 –
@MichaelZajac私は 'ResponseClass'を受け取った' Response'のクラスと比較するバリデータを持っています。レスポンスタイプがある場合、それは疑問になるかもしれません。他に何もないなら、この質問は面白いです。それは実用的です。興味があるなら、[here](http://ideone.com/z4cC8C)を見てください。 – erip
'type ResponseType <:Response'を使うのは正しい方向に進んでいますが、' classOf'を使うとうまく動作しないので、抽象クラスから抜け出す必要があると思います。それ以外の場合は、不変の型メンバーがあります。 –