我已经确认这是2.10.4和2.11.1中的一个问题
我的目标是结合implicits和类型投影...我想知道是否有办法让这个工作?
trait Plat[P <: Plat[P]] {
type Keyed[_, _]
}
class MPlat extends Plat[MPlat] {
type Keyed[K, V] = (K, TraversableOnce[V])
}
trait Prod[P <: Plat[P], T, This <: Prod[P, T, This]] {
def name(str: String)(implicit wrap: Wrapper[P, T, This]): This = wrap(this)
}
trait KProd[P <: Plat[P], K, V] extends Prod[P, P#Keyed[K, V], KProd[P, K, V]]
object Wrapper {
implicit def keyedWrapper[P <: Plat[P], K, V]: Wrapper[P, P#Keyed[K, V], KProd[P, K, V]] =
new Wrapper[P, P#Keyed[K, V], KProd[P, K, V]] {
override def apply(p: Prod[P, P#Keyed[K, V], KProd[P, K, V]]): KProd[P, K, V] = throw new Exception("we made it!")
}
}
sealed trait Wrapper[P <: Plat[P], T, This <: Prod[P, T, This]] {
def apply(p: Prod[P, T, This]): This
}
以下内容应该有效
(new Prod[MPlat, (Int, TraversableOnce[Int]), KProd[MPlat, Int, Int]] { }).name("hey")
确实,这有效:
keyedWrapper[MPlat, Int, Int](new Prod[MPlat, (Int, TraversableOnce[Int]), KProd[MPlat, Int, Int]] { })
我认为这是scala类型检查程序中的一个错误,但我想知道是否有一个解决方法(同时保持相同的语义)将使此解决方案成功运行?