上下文:
我正在尝试在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
请求与B
或C
进行模式匹配:
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。 translate
或B
的C
值,但我更喜欢只具有A
类型的参数并在其上调用translate
。有可能吗?
编辑:添加以上实例会产生编译错误的实例:
class Program {
def doWork(
info: String,
request: A
): String = {
request.translate(
info,
request // compilation fails/complains about this param in both cases
)
}
}
您需要在A中而不是在子类型中覆盖T。我通过测试示例https://gist.github.com/greenclaw/5d6fdd4d4c8b7b78e35db69da141e400
创建了要点