【发布时间】:2018-01-30 04:57:07
【问题描述】:
这是示例代码:
object GenericsTest extends App {
sealed trait CommonResponse
trait Requester[SomeType] {
trait Response extends CommonResponse {
def entity: SomeType
}
case class SomeResponse(entity: SomeType) extends Response
// More Responses here...
def getResponse(): Response
}
object StringRequester extends Requester[String] {
override def getResponse(): StringRequester.Response = SomeResponse("somestring")
}
object IntegerRequester extends Requester[Integer] {
override def getResponse(): IntegerRequester.Response = SomeResponse(42)
}
val response: CommonResponse = IntegerRequester.getResponse()
response match {
case r: StringRequester.Response => println(s"Got string response ${r.entity}") // hits here =(
case r: IntegerRequester.Response => println(s"Got integer response ${r.entity}")
case other => println(s"Got other $other")
}
}
它打印 "Got string response 42" 而不是 "Got integer response 42"
真正的代码是一个实现不同类型的索引的服务,如果数据已经被索引或者没有被索引等等,会返回不同的Responses。
- 有什么解决方法吗?
- 如何让编译器对这种特殊情况发出警告?
【问题讨论】:
-
-未选中以警告外部指针。
-
如果您使用的是 scala >= 2.12.0,只需将
trait Response替换为abstract class Response即可解决问题 -
很好,@OlegPyzhcov!我认为你找到了最好的解决方案。你愿意把它作为答案吗?
标签: scala