2017-09-26 22 views
0
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) 
    } 
} 

输出:通过传递Long值来调用方法时,为什么Float参数方法得到执行?

M1浮法精氨酸方法

M1浮法精氨酸方法

  1. 按照上面的例子,我打电话使用长值M1(65升)方法,但我没有定义与长参数的m1方法,所以我预计错误,所以我预计错误,

  2. 但m1方法与Float参数方法得到执行m1(56l)方法打电话?

内部流动将如何?

任何人都可以解释一下吗?

由于

回答

3

Long.scala同伴对象存在的隐式转换:

implicit def long2float(x: Long): Float = x.toFloat

另外在Predef.scala存在用于自动装箱和autounboxing转化:

implicit def long2Long(x: Long) = java.lang.Long.valueOf(x)

所以首先你的65l自动装箱到Long(65),然后转换为Float

0

下面是Long实施Scala

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 
} 

当你在最后看到的,有两个隐含的方法。方法隐式地将long转换为float

当您向接受float的方法证明long时,此方法用于转换。

相关问题