Вам не нужен апскейтинг. Вам нужно только приписать некоторый тип, который имеет метод unary_!
:
def dead(q: Nothing): Unit = {
!(q: Boolean)
}
Без явного указания типа метод unary_!
просто не может быть разрешен, поскольку, хотя Nothing
является подтипом из Boolean
, это не подкласс из Boolean
, поэтому компилятор не может найти метод unary_!
в иерархии наследования Nothing
.
Тот факт, что вы можете определять такие методы и функции, также не является ошибкой. Ниже приведена полностью допустимая программа, которая использует функцию с типом ввода Nothing
для получения совершенно значимого результата 0
, без каких-либо ошибок или чего-либо подобного:
def foo[X](xs: List[X], f: (Int, X) => Int) = {
xs.foldLeft(0)(f)
}
foo(Nil, (i: Int, n: Nothing) => 42)
Наличие Nothing
в системе типов - это действительно хорошая идея, потому что это начальный объект (для каждого типа A
есть ровно одна функция Nothing => A
), и он упрощает многие вещи, потому что это не заставляет вас иметь дело со всеми видами странных угловых случаев.