Scala不知道与基元类型包装器一起使用哪个重载

时间:2014-05-14 08:27:54

标签: scala primitive-types

我有这堂课:

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()方法有很多重载,包括:

  • put(String,Float)
  • put(String,Double)
  • put(String,Long)
  • put(String,Int)

在编译Float,Int,Long和Date版本时收到以下错误:

  • 两种方法都放在类型为(x $ 1:String,x $ 2:Double)Unit的ContentValues类中 [error]和方法放在类ContentValues中的类型(x $ 1:String,x $ 2:Float)单位

Scala编译器如何被愚弄。

对我来说,没有任何关系,因为可以获得完美的匹配。

这是Scala编译器中的错误还是设计错误?

我已经在此blog entry之前阅读。

使用Scala 2.10.4。我还没有使用Scala 2.11.0进行测试。

2 个答案:

答案 0 :(得分:2)

Scala通过采用可能适用的方法然后选择其中最具体的方法来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

答案 1 :(得分:0)

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