параметры типа и числовое расширение

Как мы знаем, мы можем добавить (вычесть / умножить / и т. Д.) Два числа разныхNumeric типы и результат будут шире из двух типов, независимо от их порядка.

33F + 9L  // Float + Long == Float
33L + 9F  // Long + Float == Float

Это потому, что каждый из 7Numeric классы (Byte, Short, Char, Int, Long, Float, Double) имеет 7 разных+() методы (и-(), *()и т. д.), один на каждогоNumeric тип, который можно получить как переданный параметр. [Есть дополнительный+() метод для обработкиString параметр, но это не должно касаться нас, он, ре.]

Теперь рассмотрим следующее:

implicit class PlusOrMinus[T: Numeric](a: T) {
  import Numeric.Implicits._
  def +-(b: T) = if (util.Random.nextBoolean) a+b else a-b
}

Это работает, если два операнда имеют одинаковый тип, но также работает, если тип 1-го операнда шире, чем тип 2-го.

11F +- 2L  // result: Float = 9.0 or 13.0

Я считаю, что здесь происходит то, что компилятор используетслабое соответствие достигатьчисловое расширение на 2-м операнде (b параметр), как он передается+-() метод.

Но 1-й операнд не будет расширен, чтобы соответствовать 2-му. Это даже не скомпилируется.

11L +- 2F  // Error: type mismatch; found: Float(2.0) required: Long

Есть ли способ обойти это ограничение?

Я не могу использовать другой параметр типа дляb аргумент (def +-[U: Numeric](b: U) = ...) потому чтоNumeric, выраженный через параметр типа, может только добавлять / вычитать свой собственный тип.

Это единственное решение для создания 7 различных классов (PlusOrMinusShort/Int/Long/и т. д.) с 7 различными методами (def +-(b:Short), def +-(b:Int), def +-(b:Long), так далее.)?

Ответы на вопрос(1)

Ваш ответ на вопрос