对不起,标题很混乱。如何覆盖具有相同基类的类的类型成员?
我正在尝试编写一些Request
和Response
类用于验证和解析的目的。我希望在编译时有一些类型的保证,但仍然有运行时多态性。我有以下基类:
abstract class Response()
abstract class Request() {
type ResponseType = Response
def ResponseClass: Class[_ <: ResponseType] = classOf[ResponseType]
}
所以如果我有_ <: Request
类型的一个实例,我可以解析,例如JSON响应,正确类型:Json.parse(responseString).as[request.ResponseType]
。
我发现,当我向这些类,我无法override
的ResponseType
:
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'的类。如果我有响应类型,它可能会变得没有意义。如果没有别的,这个问题很有趣。充其量是最实用的。如果您有兴趣,请参阅[这里](http://ideone.com/z4cC8C)。 – erip
我会说,使用'类型ResponseType <:Response'是一个正确的方向,但使用'classOf'并不能很好地工作,这就是为什么它需要退出抽象类。否则,你有一个不变的类型成员。 –