2014-05-14 17 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()。