trait Foo
trait Bar extends Foo
def doStuff[T <: Foo](x: T)(implicit ev: T =!:= Foo) = x
doStuff(new Foo{}) //ambiguous implicit value
doStuff(new Bar)// successful
Неявное разрешение происходит во время компиляции, поэтому я думаю, что здесь могут быть два неявных значения с одинаковым типом для запуска двусмысленных вещей.
Прямо сейчас я собираюсь ввести в команду shapeless, мои коллеги считают, что этот двусмысленный имплицит не идеален, и у меня нет сильных аргументов по этому поводу. Это единственный способ сделать это, чтобы сделать тип безопасным в scala. Если это так, что я могу сделать, чтобы настроить сообщение об ошибке?
Изменить:
В бесформенном я хочу сделать сумму 2 NAT не равной 7, я могу кодировать так, чтобы компиляция не удалась.
def typeSafeSum[T <: Nat, W <: Nat, R <: Nat](x: T, y: W)
(implicit sum: Sum.Aux[T, W, R], error: R =:!= _7) = x
typeSafeSum(_3, _4)
но сообщение об ошибке имеет неоднозначное неявное значение, как я могу настроить сообщение об ошибке?