def testLong(v: Any): Unit = {
println(v.getClass) // print: class java.lang.Long
}
testLong(103L) // compile passed
从上一片段开始,它显示变量v
是class java.lang.Long
。它是java.lang.Object
的子类。
我们还从scala Unified types系统知道AnyRef
等于java.lang.Object
类型。但是为什么编译失败如下:
def testLong(v: AnyRef): Unit = {
println(v.getClass)
}
testLong(103L) // compile failed
答案 0 :(得分:3)
第二个示例中未使用隐式转换的原因可能是因为:
// val l: AnyRef = 10L
// error: the result type of an implicit conversion must be more specific than AnyRef.
此answer可能会解释为什么会发生这种情况。
但是,您可以使用隐式证据重新编写您的方法以使其起作用。
def testLong[T](v: T)(implicit ev: T => AnyRef): Unit = {
println(v.getClass)
}
testLong(10L)
// class java.lang.Long
很好奇,如果您仅将方法设为Long,则打印的类将更改。
def testLong(v: Long)(implicit ev: Long => AnyRef): Unit = {
println(v.getClass)
}
testLong(10L)
// long