Неявные преобразования не работают с параметрами типа - PullRequest
1 голос
/ 01 апреля 2012

У меня проблема с неявными преобразованиями, не работающими при определенных обстоятельствах (типы с более высоким родом).Для данной системы, типа выражения и двух конкретных подтипов выражения:

trait Sys[S <: Sys[S]]

object Expr {
  trait Var  [S <: Sys[S], A] extends Expr[S, A]
  trait Const[S <: Sys[S], A] extends Expr[S, A]
}
trait Expr[S <: Sys[S], A]

И класса сутенера для операций выражения:

class RichDoubleExpr[S <: Sys[S]](ex: Expr[S, Double]) {
  def gugu(): String = "yes"
}

Тогда пусть будут неявные преобразования из примитивов ввыражений и от выражений до выражений ops:

implicit def const[S <: Sys[S]](d: Double): Expr[S, Double] = 
  new Expr.Const[S, Double] {}

implicit def exprOps[S <: Sys[S], A <% Expr[S, Double]](v: A): RichDoubleExpr[S] = 
  new RichDoubleExpr( v )

Следующие работы (таким образом, неявный метод const):

3.4.gugu()

Следующая не не работает(таким образом, неявный метод exprOps):

def test[S <: Sys[S]]: String = {
  val v = new Expr.Var[S, Double] {}
  v.gugu()
}

со следующей ошибкой:

error: No implicit view available from java.lang.Object with
   Expr.Var[S,Double] => Expr[S,Double].
          v.gugu()
          ^

Теперь, поскольку Expr.Var расширяет Expr и параметры типа идентичны, этосообщение об ошибке явно не имеет смысла для меня.Есть идеи как это исправить?

1 Ответ

3 голосов
/ 01 апреля 2012

Жизнеспособным решением в моем случае является несколько «исправить» параметр типа S:

class ExprImplicits[S <: Sys[S]] {
  implicit def const(d: Double): Expr[S, Double] = new Expr.Const[S, Double] {}

  implicit def exprOps[A <% Expr[S, Double]](v: A): RichDoubleExpr[S] = 
    new RichDoubleExpr(v)
}

Теперь я могу импортировать последствия для конкретной системы:

def test[S <: Sys[S]]: String = {
  val imp = new ExprImplicits[S]
  import imp._

  3.4.gugu()  // ok
  val v = new Expr.Var[S, Double] {}
  v.gugu()    // ok
}
...