Если ничто не находится в нижней части иерархии классов, почему я не могу называть на него какой -либо мыслимый метод?
Вопрос
Тип скалы Nothing
представляет (насколько я понимаю) нижняя часть иерархии типа, также обозначаемой символом ⊥. То есть, Nothing
является подтипом любого данного типа. Требование к Nothing
тип хорошо объяснил Джеймс Ири Для тех из нас, у кого нет теоретического происхождения в теории типа!
Итак, мой вопрос: если Nothing
это подтип каждого типа, почему я не могу называть методы какого -либо типа на Nothing
? Очевидно, я не могу создать ничего, кроме того, почему следующее не компиляция?
var n: Nothing = _
def main(args: Array[String]) {
println(n.length) //compile error: value length is not a member of Nothing
}
Конечно, как Nothing
это подтип String
Это должно быть в порядке? Обратите внимание, что следующие компиляции просто отлично!
var n: Nothing = _
def foo(s: String) : Int = s.length
def main(args: Array[String]) {
println(foo(n))
}
как делает:
def main(args: Array[String]) {
println(n.asInstanceOf[String].length)
}
Решение
Пока Nothing
это подтип всего, он не наследовать любой метод, кроме тех, кто находится в Any
. Анкет Это потому что Nothing
больше ориентирован на функциональный конец языка. Это необходимо для таких вещей, как Option
а также List
, но только как тип, не как класс.
Различие здесь немного странно для тех, кто поступает из объектно-ориентированного фона, но факт в том, что подтинка как концепция очень отличается от ООП. Конечно, объектно-ориентированный действительно подразумевает подтип в той или иной форме, но обратное неправда. Бенджамин Пирс Типы и языки программирования Хорошая работа по представлению языка Фантаст (произносится «f sub»), который служит минимальным примером языка с подтингом (но не OO).
Теперь, со всеми сказанными, я согласен с тем, что тот факт, что Nothing
Застраховано от нормальных правил наследования, кажется немного непоследовательным. Однако с теоретической точки зрения это имеет смысл.
Другие советы
я полагаю Nothing
может принять любой метод и выполнить стандартную операцию на всех из них (выбрасывая исключение). Это было бы не очень полезно, хотя.
Представляя ошибку компиляции, компилятор предупреждает программиста, что тип, который он, скорее всего, не хотел, Nothing
, как -то вышел в определенный момент в коде.
Вы можете позвонить toString
на Nothing
переменная из -за определения этого:
final trait Nothing extends Any
И Tostring является членом Any
. Анкет Я думаю, что компилятор Scala Compiler Nothing
Только в границах типа и рассматривает его как любую другую черту во всех случаях. Разрешение вызывать любой метод на переменной с типом Nothing
Думаю, будет очень странно.