这是我的情况:Scala的方法与类型参数
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] 懒VAL S = r.method [PointPO,PointBO](新PointPO,新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参数
有另一种解决方案来做到这一点?
问候。
您就协方差的第二个问题,看看这里:HTTPS:/ /stackoverflow.com/questions/9619121/why-is-parameter-in-contravariant-position – thwiegan