Я написал такую функцию:
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)
Возможно, вы хотите написать общий код, который позволяет избежать бокса. Если это так, вам нужно будет изучить специализацию.
Any
по умолчанию - java-примитивам. Чего ты пытаешься достичь?