Scala编译器是否可能了解重写的抽象类型

问题描述 投票:0回答:1

上下文:

我正在尝试在RESTful端点中使用Jackson的JsonSubTypes提供的多态子类型。各个请求主体之间有一些共性,所以我有:

abstract class A extends Translatable {
  val infoA: String
  val infoB: String
}

case class B(
  infoA: String,
  infoB: String,
  infoC: String
) extends A {
  override type T = B
  def translate(
    requestInfo: String,
    request: B
  ): String = ...
}


case class C(
  infoA: String,
  infoB: String,
  infoC: Array[String]
) extends A {
  override type T = C
  def translate(
    requestInfo: String,
    request: C
  ): String = ...
}

具有以下特征,因此不必将传入的A请求与BC进行模式匹配:

trait Translatable {
  type T <: A
  def translate(
    requestInfo: String,
    request: T
  ): String
}

问题是我编译时抱怨类型不匹配:

found: request.type (with underlying type com.program.A)
required: request.T

我尝试了一些尝试,但都没有成功,只有这个似乎很接近:

  • 隐式广义类型约束
e.g.,
def translate[X](
  requestInfo: String,
  request: X
)(implicit ev: X <:< A) = ...
(modifying the case class impl. of ^ accordingly)

但这导致

无法证明该com.program.A

关于如何执行此操作的任何想法?还是我必须忍受模式匹配?我说是因为第一个代码块在I模式匹配时起作用,并调用了具体的impl。 translateBC值,但我更喜欢只具有A类型的参数并在其上调用translate。有可能吗?

编辑:添加以上实例会产生编译错误的实例:

class Program {
  def doWork(
    info: String,
    request: A
  ): String = {
    request.translate(
      info,
      request // compilation fails/complains about this param in both cases
    )
  }
}
scala inheritance types jackson abstract
1个回答
0
投票

您需要在A中而不是在子类型中覆盖T。我通过测试示例https://gist.github.com/greenclaw/5d6fdd4d4c8b7b78e35db69da141e400

创建了要点
© www.soinside.com 2019 - 2024. All rights reserved.