Как компилятор интерпретирует это?:
foo match {
case bar: Bar => println("First case statement")
case _ =>
}
Второй случай оставлен пустым, и ничего не вернуть.
Как компилятор интерпретирует это?:
foo match {
case bar: Bar => println("First case statement")
case _ =>
}
Второй случай оставлен пустым, и ничего не вернуть.
Это означает return Unit
:
val res: Unit = new foo match {
case bar: Bar => println("First case statement")
case _ =>
}
Если вы измените свой оператор, чтобы вернуть что-то вместо println
(который возвращает Unit
):
val res: Any = new foo match {
case bar: Bar => "it a bar"
case _ =>
}
Теперь компилятор сделал вывод Any
, потому что это первый общий супертип между String
и Unit
.
Обратите внимание, что совпадение в вашем случае неверно, потому что совпадение только с bar
означает "поймать все переменные", возможно, вы хотели bar: Bar
.
В примере соответствия шаблону необходим пустой по умолчанию случай, поскольку в противном случае выражение match будет вызывать MatchError для каждого аргумента expr, который не является баром.
Тот факт, что для этого второго случая не указан никакой код, поэтому, если этот случай выполняется, он ничего не делает.
Результатом любого из них является значение Unit (), что также является результатом всего выражения соответствия.
Подробнее об этом в Martin Odersky Программирование в Scala в разделе Классы классов и соответствия шаблону.
Пустой регистр по умолчанию необходим в вашем примере сопоставления с шаблоном, потому что в противном случае выражение соответствия будет выдавать MatchError для каждого аргумента expr, который не является баром.
Так что, возможно, в текущей версии scala это правило не работает, действительно показывает, что конструктор не может быть создан для ожидаемого типа