2016-10-28 36 views
0

在嘗試使用類型變量時,我嘗試了下面的代碼,但它失敗了(嘗試編寫可添加任何兩種數據類型的泛型代碼)。在Scala中解釋這個錯誤(類型參數)

讓我感到驚訝的是錯誤。爲什麼編譯器會抱怨它需要一個String數據類型?我沒有在代碼

scala> def add[A](x:A, y:A) = {x+y} 
<console>:16: error: type mismatch; 
found : A 
required: String 
     def add[A](x:A, y:A) = {x+y 

回答

3

由於A不受任何約束的任何地方提到的字符串,它可以是任何類型。具體而言,該類型不一定有+方法(您嘗試在方法體中調用)。然後,編譯器試圖找到一些隱式轉換可能把x成某種類型與+方法,並發現從Predef.scalathis隱式轉換爲String

implicit final class any2stringadd[A](private val self: A) extends AnyVal { 
    def +(other: String): String = String.valueOf(self) + other 
} 

因此,該方法的身體變得等同於:

String.valueOf(x).+(y) 

但後來 - 因爲String.+需要一個字符串參數,y不是一個字符串的編譯器失敗。

編輯: 要創建一個「通用」除了功能,您必須確保它可以被添加的方式束縛你的類型A。這樣做是使用Numeric類型的一種方法:

def add[A : Numeric](x:A, y:A) = { implicitly[Numeric[A]].plus(x, y) } 

,這意味着你的函數可以調用任何類型A對於其隱含Numeric[A]存在。

+0

優秀的解釋! – Shankar