在通过长度值调用方法时,为什么float参数方法被执行


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方法

  1. 按照上述示例,我正在调用具有长度值的M1(65L)方法,但是我没有用长时间参数定义M1方法,所以我期望错误,

  2. 但是使用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的方法时,此方法用于转换。

相关内容

最新更新