2014-05-14 18 views
0

我有這個類:斯卡拉不知道哪個超載與原語類型的包裝紙

implicit class Escritor(cv: ContentValues) extends AnyVal { 
    def pon[T](col: Columna[T], valor: Int) = { 
     cv.put(col.nombre, valor) 
     cv 
    } 

    def pon[T](col: Columna[T], valor: Long) = { 
     cv.put(col.nombre, valor) 
     cv 
    } 

    def pon[T](col: Columna[T], valor: Float) = { 
     cv.put(col.nombre, valor) 
     cv 
    } 

    def pon[T](col: Columna[T], valor: Double) = { 
     cv.put(col.nombre, valor) 
     cv 
    } 

    def pon[T](col: Columna[T], valor: Date) = { 
     cv.put(col.nombre, valor.getTime) // getTime returns long 
     cv 
    } 
} 

ContentValues class有許多重載的put()方法,包括:

  • 放(串,浮動)
  • 認沽(字符串,雙人間)
  • 認沽(字符串,龍)
  • 認沽(字符串,整數)

我編譯浮子時收到以下錯誤,中等,長和日期的版本:

  • 兩種方法放在類型的類ContentValues(X $ 1:字符串,X $ 2:雙人間)單位 [錯誤]和方法,把在課堂ContentValues式(X $ 1:字符串,X $ 2:浮動)單位

如何Scala編譯器上當。

對我來說,應該沒有困難,因爲可以獲得完美的匹配。

這是Scala編譯器中的錯誤還是設計?

我以前讀過blog entry

使用Scala 2.10.4。我沒有測試過Scala 2.11.0。

回答

2

斯卡拉做overload resolution通過採取可應用,然後選擇其中最具體的方法。

數字展寬意味着(java.lang.Float)和(java.lang.Double)適用於int arg,但這些盒裝java類型不會被提升,所以都不會被視爲更具體。他們是蘋果和桔子。

所以此工程:

scala> val i: java.lang.Float = 3 
i: Float = 3.0 

但鑑於

scala> def f(x: java.lang.Double) = x 
f: (x: Double)Double 

scala> f(3.0f) 
res5: Double = 3.0 

scala> f(new java.lang.Float(3.0f)) 
<console>:12: error: type mismatch; 
found : Float 
required: Double 
       f(new java.lang.Float(3.0f)) 
       ^

然而,

scala> object X { def f(i: java.lang.Integer) = 0 ; def f(j: java.lang.Float) = 0 ; def f(k: java.lang.Double) = 0 } 
defined object X 

然後你可以預先推廣:

scala> X f (5: java.lang.Integer) 
res8: Int = 0 
+0

我覺得在Java中你沒有這種問題。 –

+0

@ david.perez重載解析本質上是特殊的;語言在不同的邊緣情況下具有不同的規則。 –

0

一個可能的解決方案是使用:Float.box(),Long.box()和Int.box()。