2015-02-04 69 views

回答

2

沒有共同的超類型所有可能的數值類型在Scala中,所以我會用Numeric特質。它不是一種類型綁定,而是一種類型類,您可以要求在範圍內提供隱含的Numeric[A]。蘊涵已經存在於所有Scala數字類型的範圍內。

def a[T](t: T)(implicit num: Numeric[T]): T = num.times(t, t) 

或者

def a[T: Numeric](t: T): T = implicitly[Numeric[T]].times(t, t) 
+0

它的工作原理,但很繁瑣。對於這樣一個典型的問題,真的沒有比這更清潔的解決方案嗎? Scala核心團隊是否故意不提供數字類型的類?有了這樣一個類,只需要'def a [T <:Numeric](t:T):T = t * t'? – Jivan

+0

@Jivan'數字'_is_類型類。 'T <:數字'意味着'T'是'Numeric'的子類型。不幸的是,這是一個基本上從Java繼承的問題,因爲Java的數字類型在基元和對象之間分割。 Scala可以實現它自己的類型,但是可能存在互操作性和優化問題。如果你不喜歡寫出'num.times(t,t)',那麼你總是可以在上面的例子中導入scala.math.Numeric.Implicits._'並寫入't * t' 。 –

1

斯卡拉spire庫是真棒。它提供了許多類型的數字抽象。

import spire.math._ 
import spire.implicits._ 

def negate[A: Integral](x: A) = -(42 * (x /~ 42) + x % 42) 
0

也發現了類似的解決方案(即允許分裂,太)

import scala.math.Integral.Implicits._ 

def a[T:Integral](t:T):T = t * t/t