私たちが知っているように、異なる数の異なる2つの数値を加算(減算/乗算など)することができ、その結果はその順序にかかわらず2種類のうちより広いものになります。型パラメータと数値の拡大
33F + 9L // Float + Long == Float
33L + 9F // Long + Float == Float
7つのNumeric
クラス(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
}
これは、2つのオペランドが同じタイプであれば動作しますが、それ第1オペランドの型が第2型の型よりも広い場合にも有効です。私はここで何が起こっていると考えている
11F +- 2L // result: Float = 9.0 or 13.0
は、コンパイラは、それが+-()
メソッドに渡されたとして、第二オペランド(b
パラメータ)にnumeric wideningを達成するためにweak conformanceを使用していることです。
ただし、第1オペランドは第2オペランドと一致するように拡大されません。それはコンパイルされません。
11L +- 2F // Error: type mismatch; found: Float(2.0) required: Long
この制限はありますか?
Numeric
は、型パラメータで表現し、それだけの独自のタイプを加算/減算することができますので、私は
b
引数(
def +-[U: Numeric](b: U) = ...
)のための異なるタイプのパラメータを使用することはできません
。
は、7種類の方法で7つの異なるクラス(PlusOrMinusShort/Int/Long/
など)を作成するための唯一のソリューションです(def +-(b:Short)
、def +-(b:Int)
、def +-(b:Long)
、など)?ここで