параметры типа и числовое расширение
Как мы знаем, мы можем добавить (вычесть / умножить / и т. Д.) Два числа разных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)
, так далее.)?