Если ничто не находится в нижней части иерархии классов, почему я не могу называть на него какой -либо мыслимый метод?

StackOverflow https://stackoverflow.com/questions/1728541

  •  19-09-2019
  •  | 
  •  

Вопрос

Тип скалы 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 Думаю, будет очень странно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top