Удержание scala типа в переменной - PullRequest
0 голосов
/ 19 апреля 2020

Мне нужно динамически передать asInstanceOf параметр типа. Как я могу это сделать?

Это лучшее, что мне удалось сделать:

val fieldLength = 4
var dType: Class[Any] = null

fieldLength match {
    case 4 =>
        dType = Int.getClass

    case 8 =>
        dType = Double.getClass
}

val byteBuffer = ByteBuffer.allocate(fieldLength)
    .putInt(row.get(i).asInstanceOf[dType])

Но, очевидно, этот код не компилируется.

Ответы [ 2 ]

2 голосов
/ 19 апреля 2020

Проблема с вашим дизайном заключается в том, что putInt позволяет пропускать только Int, но вы пытаетесь передать как Int, так и Double, что не сработает.

Распространенным способом проектирования является кэширование. функция put вместо типа класса, например

val fieldLength = 4
val putObj = (buf: ByteBuffer, obj: Any) => fieldLength match {
    case 4 =>
        buf.putInt(obj.asInstanceOf[Int])
    case 8 =>
        buf.putDouble(obj.asInstanceOf[Double])
    //other cases or catch all
}

val byteBuffer = putObj(ByteBuffer.allocate(fieldLength), row.get(i))

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

1 голос
/ 19 апреля 2020

Проблема в том, что asInstanceOf не будет работать, если вы не ожидаете тип значения, возвращаемого get. Так что лучше match по типу этого значения для безопасности:

val byteBuffer = ByteBuffer.allocate(fieldLength)

row.get(i) match {
  case int: Int =>
    byteBuffer.putInt(i)
  case double: Double =>
    byteBuffer.putDouble(double)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...