繁体   English   中英

在Scala中传递varargs时,如何避免隐式类型转换?

[英]How to avoid implicit type conversion when pass varargs in Scala?

我写了这样的函数:

def a (params:Any*) = {
    val clazzes = params.map(_.getClass)
    ...
}

但是,当我传入Scala Long类型的参数时,它会自动转换为java.lang.Long有什么方法可以避免这种情况?

您可以禁止在Predef中定义的默认隐式转换:

import Predef.{long2Long=>_,println}

object Test{

  val tL : java.lang.Long = 1L

}

然后,您将得到一个类型错误:

Error:(26, 29) type mismatch;
 found   : scala.Long(1L)
 required: java.lang.Long
  val tL : java.lang.Long = 1L
                        ^

但是,在您的情况下,您的参数将被装箱为Any *(包装的数组)。 scala long的运行时框式表示形式是java.lang.Long。 这不是隐式转换,因此不会被抑制。

import Predef.{long2Long=>_,println}

object Test extends App{

   def a(params: Any*) = {
    for(p<-params) yield(p.getClass)
  }

  println(a(1L))

}

输出:

ArrayBuffer(class java.lang.Long)

您可能希望编写避免装箱的通用代码。 如果是这样,您需要研究专业化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM