Получение типа случая по умолчанию при обработке образцов - PullRequest
2 голосов
/ 26 апреля 2020

Я хочу знать тип объекта в сопоставлении с образцом, когда запускается регистр по умолчанию.

Это то, что я пробовал:

    byeBuffer = 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)

      case _ => throw new UnsupportedOperationException("Type not supported: " + _.getClass())
    }

Но там написано "Не могу разрешить символ getClass ".

Ответы [ 2 ]

5 голосов
/ 26 апреля 2020

В этом контексте _ означает, что никакому идентификатору не будет присвоено сопоставленное значение.

Вы можете заменить _ любым идентификатором без типа, и он все равно будет соответствовать оставшимся случаям:

byeBuffer = 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)

  case default => throw new UnsupportedOperationException(s"Type not supported: ${default.getClass()}")
}
3 голосов
/ 26 апреля 2020

Существует общее недопонимание того, как подчеркивания работают в

case _ => throw new UnsupportedOperationException("Type not supported: " + _.getClass())

Два подчеркивания не соответствуют друг другу, вместо этого они расширены до чего-то вроде

case _ => throw new UnsupportedOperationException(x => ("Type not supported: " + x.getClass()))

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

...