Scala中的隐式函数未按预期工作

Ant*_*era 3 scala

如果我定义了以下需要Long的函数,并且我定义了以下隐式函数,那么当我将Date传递给第一个函数并且一切按预期工作时,将使用隐式函数:

def millisToDays(in: Long): Int = (in / (1000L * 3600L * 24L)).toInt
implicit def dateToLong(d: Date) = d.getTime
println(millisToDays(new Date))
Run Code Online (Sandbox Code Playgroud)

但是对于下面的第二个例子,我在第三行得到编译器错误:"推断类型参数[Int]不符合方法mySum的类型参数bounds [t <:java.lang.Number]"

def mySum[T <: Number](as: T*): Double = as.foldLeft(0d)(_ + _.doubleValue)
implicit def intToInteger(n: Int): Integer = new Integer(n.toInt)
var r = mySum(2, 3)
Run Code Online (Sandbox Code Playgroud)

我做错了什么?为什么不使用intToInteger隐式函数?

我猜测问题是隐式函数不返回"T <:Number",而是返回一个Integer,因此编译器无法猜测隐式函数实际上是否有用.

无论如何,我可以给编译器一个提示,它应该使用隐式函数?

谢谢!蚂蚁

Dan*_*mon 5

[T <: Number]类型界定意味着T必须是一个亚型Number.隐式转换为Intto Integer不会给你这个,因为即使转换可用,它仍然不意味着它Int是一个子类型Number.

幸运的是,有类似的被称为视图边界的东西,写入[T <% Number],它准确地指定了你想要的东西,有一个隐含的转换可用TNumber

  • 如果你这样做,那么你的自定义隐式`intToInteger`就可以删除,因为Scala会为你做. (2认同)