class Demo
{
def m1(a: Float)
{
println("m1 Float-arg method");
}
}
object Demo1
{
def main(args: Array[String])
{
val demo = new Demo
demo.m1(10f)
demo.m1(65l)
}
}
输出:
m1 float-arg方法
m1 float-arg方法
按照上述示例,我正在调用具有长度值的M1(65L)方法,但是我没有用长时间参数定义M1方法,所以我期望错误,
但是使用float参数方法的M1方法执行了M1(56L)方法调用?
内部流程如何?
任何人都可以解释吗?
谢谢
在 Long.scala
伴随对象中有一个隐式转换:
implicit def long2float(x: Long): Float = x.toFloat
在Predef.scala
中也有用于自动氧化和自动盒的转换:
implicit def long2Long(x: Long) = java.lang.Long.valueOf(x)
因此,首先,您的65l
自动介绍至Long(65)
,然后转换为Float
。
这是Long
的CC_8实现:
object Long extends AnyValCompanion {
/** The smallest value representable as a Long. */
final val MinValue = java.lang.Long.MIN_VALUE
/** The largest value representable as a Long. */
final val MaxValue = java.lang.Long.MAX_VALUE
/** Transform a value type into a boxed reference type.
*
* Runtime implementation determined by `scala.runtime.BoxesRunTime.boxToLong`. See [[https://github.com/scala/scala src/library/scala/runtime/BoxesRunTime.java]].
*
* @param x the Long to be boxed
* @return a java.lang.Long offering `x` as its underlying value.
*/
def box(x: Long): java.lang.Long = java.lang.Long.valueOf(x)
/** Transform a boxed type into a value type. Note that this
* method is not typesafe: it accepts any Object, but will throw
* an exception if the argument is not a java.lang.Long.
*
* Runtime implementation determined by `scala.runtime.BoxesRunTime.unboxToLong`. See [[https://github.com/scala/scala src/library/scala/runtime/BoxesRunTime.java]].
*
* @param x the java.lang.Long to be unboxed.
* @throws ClassCastException if the argument is not a java.lang.Long
* @return the Long resulting from calling longValue() on `x`
*/
def unbox(x: java.lang.Object): Long = x.asInstanceOf[java.lang.Long].longValue()
/** The String representation of the scala.Long companion object. */
override def toString = "object scala.Long"
/** Language mandated coercions from Long to "wider" types. */
import scala.language.implicitConversions
implicit def long2float(x: Long): Float = x.toFloat
implicit def long2double(x: Long): Double = x.toDouble
}
,如您所见,有两种隐式方法。long2float
方法将long
隐式转换为float
。
当您将long
证明接受float
的方法时,此方法用于转换。