如果我定义了以下需要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,因此编译器无法猜测隐式函数实际上是否有用.
无论如何,我可以给编译器一个提示,它应该使用隐式函数?
谢谢!蚂蚁
的[T <: Number]类型界定意味着T必须是一个亚型的Number.隐式转换为Intto Integer不会给你这个,因为即使转换可用,它仍然不意味着它Int是一个子类型Number.
幸运的是,有类似的被称为视图边界的东西,写入[T <% Number],它准确地指定了你想要的东西,有一个隐含的转换可用T到Number
| 归档时间: |
|
| 查看次数: |
465 次 |
| 最近记录: |