2016-03-16 55 views
1

如何定義foo,以便它可以與任何具有方法math.max的類型一起使用?錯誤指出max不能應用於(A,A)。那麼,如果碰巧是錯誤中提到的任何類型,那麼它可以是,那就是我想要的。這不就是多態類型參數的全部意義嗎?我甚至嘗試過富[A <:數字]但得到相同的錯誤。如何避免「錯誤:重載的方法...與替代方案:」

scala> def foo[A](a: A, b: A) = math.max(a,b) 
<console>:9: error: overloaded method value max with alternatives: 
(x: Double,y: Double)Double <and> 
(x: Float,y: Float)Float <and> 
(x: Long,y: Long)Long <and> 
(x: Int,y: Int)Int 
cannot be applied to (A, A) 
     def foo[A](a: A, b: A) = math.max(a,b) 

回答

0

我不知道你爲什麼會想這樣做。 math.max工作沒有包成什麼就好了,但如果你絕對必須,則解決方案將是這個樣子

def foo[A](a:A,b:A)(implicit c:Numeric[A]) = c.max(a,b) 
    foo(1,2) //2 
    foo('a',4l) //97 
    foo('g',"1") // error: could not find implicit value for parameter c: Numeric[Any] 

等等...

+0

當然,你的權利。爲了提出我的問題,我只需要一個在它的正文中有一些類型要求的函數來表示我的實際用例。請幫助我瞭解您的解決方案。您爲foo添加了第二個參數列表,以便定義Numeric [A]類型的隱式參數c。那麼你可以在def體中使用c來訪問第一個參數列表中的參數。爲什麼這個工作?它 – user3076170

+0

你對隱式的使用正是我想要的,但我不太明白它爲什麼起作用。你能否向我介紹一下你如何使用隱含的進一步解釋。 @PavelOliynyk如何使用它們是不同的。 – user3076170

+0

它歸結爲咖喱功能。例如,你可以像add(a:Int)(b:Int)= a + b')那樣重寫一個簡單的函數,比如'add(a:Int,b:Int):Int = a + b',然後部分地應用它創建新的函數'add5 = add(5)_',然後像這樣使用'add5(2)// 7'。你也可以這樣做:def addImplicit(a:Int)(implicit b:Int)'。隱式關鍵字告訴編譯器爲特定類型的值搜索隱式作用域。示例'addImplicit(5)//編譯器錯誤 - 找不到Int的implciti值,'隱式val b = 5; addImplicit(5)// 10'。希望這可以幫助 – ddkr

相關問題