获得隐式解决方案和类型投影?可能需要一个解决方法

时间:2014-06-16 22:17:21

标签: scala

我已经确认这是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类型检查程序中的一个错误,但我想知道是否有一个解决方法(同时保持相同的语义)将使此解决方案成功运行?

0 个答案:

没有答案