Scala шаблон соответствия для типа - PullRequest
1 голос
/ 25 апреля 2020

Я написал следующий код:

array(0).getClass match {
  case Int.getClass =>
    byeBuffer = ByteBuffer.allocate(4 * array.length)

  case Long.getClass =>
    ByteBuffer.allocate(8 * array.length)

  case Float.getClass =>
    ByteBuffer.allocate(4 * array.length)

  case Double.getClass =>
    ByteBuffer.allocate(8 * array.length)

  case Boolean.getClass =>
    ByteBuffer.allocate(1 * array.length)

Однако чрезмерное использование getClass кажется мне неуклюжим.

Есть ли лучший способ написать это?

1 Ответ

4 голосов
/ 25 апреля 2020

Вы можете опустить getClass и использовать оператор типа (:):

val byteBuffer = array(0) match {
  case _: Int =>
    ByteBuffer.allocate(4 * array.length)
  case _: Long =>
    ByteBuffer.allocate(8 * array.length)
  case _: Float =>
    ByteBuffer.allocate(4 * array.length)
  case _: Double =>
    ByteBuffer.allocate(8 * array.length)
  case _: Boolean =>
    ByteBuffer.allocate(1 * array.length)
}

Также обратите внимание, что match является выражением в Scala, поэтому вы можете перемещаться byteBuffer снаружи и присвойте ему результат. Такой функциональный подход сделает его чище и позволит нам избежать переназначения на var и использовать вместо него val.

Если вы хотите использовать переменную, с которой сопоставляется тип, то вы можете просто написать для пример l: Long и использовать переменную типа Long с именем l.

...