Как избежать неявного преобразования типов при передаче varargs в Scala?

1

Я написал такую функцию:

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

Но когда я передаю параметр с типом Scala Long, он автоматически преобразуется в java.lang.Long Есть ли способ избежать этого?

  • 0
    Нет, пару дней назад в этом вопросе SO была похожая проблема: компилятор по умолчанию использует примитивные типы при работе с коробочными типами, а в этом случае он равен Any по умолчанию - java-примитивам. Чего ты пытаешься достичь?
Теги:
type-conversion
variadic-functions

1 ответ

0

Вы можете подавить неявное преобразование по умолчанию, определенное в 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)

Возможно, вы хотите написать общий код, который позволяет избежать бокса. Если это так, вам нужно будет изучить специализацию.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню