gpt4 book ai didi

java - 在 Scala 中传递可变参数时如何避免隐式类型转换?

转载 作者:太空宇宙 更新时间:2023-11-04 14:37:59 24 4
gpt4 key购买 nike

我写了一个这样的函数:

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)

您可能想编写避免装箱的通用代码。如果是这种情况,您需要研究特化。

关于java - 在 Scala 中传递可变参数时如何避免隐式类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25330208/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com