2015-05-12 4 views
0

В то время как это компилирует:Scala оценки типа =: =

Это жалуется на несоответствие типов, как ожидается T, фактическая Int, как будто он игнорирует тип связанного.

implicit class Container[T](val value:T=>Int) extends AnyVal{ 
    def addInt(x:Int)(implicit ev:T=:=Int) = value(x) 
    } 

Почему?

ответ

2

Ваше ограничение типа на самом деле назад. T =:= Int дает неявные доказательства того, что T является Int, но не совсем что Int is T. Если вы посмотрите на декларации, если =:=, вы увидите, что он идет только в одну сторону:

sealed abstract class =:=[From, To] extends (From => To) with Serializable 

Ваш первый пример работает, потому что value является T, и ограничение T =:= Int, который неявно преобразует T в Int. Но для второго примера нам нужно подать T на value: T => Int, поэтому нам нужно другое направление.

Это работает:

implicit class Container[T](val value: T => Int) extends AnyVal { 
    def addInt(x: Int)(implicit ev: Int =:= T) = value(x) 
} 

Причина, почему ваш второй пример использования Int <:< T также работает потому, что <:< обеспечивает неявное преобразование из Int => T.

0

Возможно, проблема заключается в противоречивости функции. Это работает сейчас:

implicit class Container[T](val value:T=>Int) extends AnyVal{ 
    def addInt(x:Int)(implicit ev:Int<:<T) = value(x) 
    }