【发布时间】:2017-06-07 12:54:55
【问题描述】:
这是我的情况:
trait BPO
trait BBO
class PointBO extends BBO
class PointPO extends BPO
class CircleBO extends BBO
class CirclePO extends BPO
trait Mapper[-P <: BPO,+B <: BBO] {
def mapAsBBO(bpo: P): B
}
class PointMapper extends Mapper[PointPO,PointBO]{
override def mapAsBBO(bpo: PointPO): PointBO = {
println("Construct point")
new PointBO
}
}
class CircleMapper extends Mapper[CirclePO,CircleBO] {
override def mapAsBBO(bpo: CirclePO): CircleBO = {
println("Construct circle")
new CircleBO
}
}
class Registry{
def method[P,B](po:P,bo:B)(implicit mapper: Mapper[P,B]) = mapper.mapAsBBO(po)
}
val r = new Registry
val s = r.method[PointPO,PointBO](new PointPO,new PointBO)
我想传递给方法method,只是两个类都参与映射,让Scala类型推断为我实现正确的映射器,这可能吗?
我收到此错误:
错误:(31, 40) 找不到参数映射器的隐式值:A$A191.this.Mapper[A$A191.this.PointPO,A$A191.this.PointBO] lazy val s = r.method[PointPO,PointBO](new PointPO,new PointBO) ^
另一种方法对我来说应该没问题,称为方法method,只传递映射器类:
val s = r.method[PointMapper](new PointPO,new PointBO)
这是完成这条街道之一的任何方法吗?如果其中一个比另一个更好,再加上一点解释。
编辑:
最初我想用两个参数协变来制作特征映射器:
trait Mapper[+P <: BPO,+B <: BBO] {
def mapAsBBO(bpo: P): B
}
这样就可以了下面的任务:
val d:Mapper[BPO,BBO] = new CircleMapper()
但是编译器向我抱怨 P 参数必须是逆变的
有替代解决方案吗?
问候。
【问题讨论】:
-
关于协方差的第二个问题,请看这里:stackoverflow.com/questions/9619121/…
标签: scala