Ваше ограничение типа на самом деле назад. 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
.