可以将`Long`隐式转换为`AnyRef`

时间:2019-01-16 13:46:41

标签: scala implicit-conversion

def testLong(v: Any): Unit = {             
  println(v.getClass)  // print: class java.lang.Long
}
testLong(103L)   // compile passed

从上一片段开始,它显示变量vclass 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

1 个答案:

答案 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