У меня сложная ситуация с типом классов в следующем формате:
sealed trait TypeClass[S <: MyType] {
type Out <: MyType
}
sealed trait LowPriorityTypeClass {
// Case: OtherTypeClass is NOT defined for the input type S.
// The output type is the same as the input type.
implicit def default[S <: MyType]: TypeClass.Aux[S, S] = ???
}
object TypeClass extends LowPriorityTypeClass {
type Aux[S <: MyType, O <: MyType] = TypeClass[S] { type Out = O }
// Case: OtherTypeClass is defined for the input type S.
// The output type is the same as in the OtherTypeClass definition.
implicit def hasOtherTC[S <: MyType, O <: MyType](
implicit otherTC: OtherTypeClass.Aux[S, O],
): TypeClass.Aux[S, O] = ???
}
Определение default
было добавлено в черту LowPriorityTypeClass
с намерением иметь более низкий приоритет. Однако неоднозначность с hasOtherTC
все еще имеет место для некоторого типа S
, очевидно, потому что объявление default
более конкретно c, чем объявление hasOtherTC
для этого типа S
.
Существует ли общий способ гарантировать, что неявное определение всегда будет иметь более высокий / более низкий приоритет, чем другое определение? (Мой вопрос не относится к указанному выше c коду.)
Дайте мне знать, поможет ли размещение более полного примера кода.