Хорошо, пытаясь объяснить, почему правила должны заставлять вас сохранять подпись с неявным параметром и дисперсией.
Во-первых, неявный аргумент по-прежнему является аргументом, он может передаваться явно, и, за исключением случаев, когда он имеет одноэлементный тип (что не очень полезно), возможны несколько различных его экземпляров.
Предположим, я создаю
case class ZModulo(val p: Int) extends Numeric[Int] {
def plus(a: Int, b: Int) = (a+b) % p
// others along the same line
}
Похоже на правильное Numeric
. В документации Numeric
не указано, какие законы следует ожидать, но ZModulo
не является необоснованным.
Теперь есть ваш
class Summable[A] {
def sum[B >: A](implicit num: Numeric[A]): B =...
}
Если у меня есть val ints : Summable[Int]
, мне, безусловно, разрешено звонить ints.Sum(ZModulo(3))
. Так что если ваш класс должен быть подклассом Summable[Int]
, он должен мне это позволить. Таким образом, вы не можете удалить параметр Numeric
.
Во-вторых, предположим, я пришел с Numeric[Any]
. Не уверен, как я мог сделать это разумно для числового значения, но спецификация и компилятор не могут этого знать. И в любом случае, они также должны принимать необоснованные реализации. Итак, давайте
object MixThemAll : Numeric[A] {...}
Подпись в Summable позволяет ints.sum(MixThemAll)
. Так что ваш подкласс тоже должен это разрешать.
Поэтому позволить вам удалить неявный параметр или дисперсию в подклассе было бы неправильно.