2015-03-24 2 views
3

Говорят, что scala.Nothing и scala.Null являются нижними классами, и они расширяют все классы AnyRef. Рассмотрим ниже фрагмент кодаScala: Null and Nothing

class Test() {} 
val test:Test = null 

Так что для заявления на удалось либо Null должен расширить пользовательский класс Test (т.е. тест супер тип Null) или тип системы должен делать исключения из не бросали ошибки несоответствия типов для scala.Null , Как scala гарантирует, что эти два класса всегда расширяют любые другие классы потомков AnyRef в scala?

+0

'Null' и' Nothing' является явно специальным обсаженным в AIUI компилятора - это то, что вы спрашиваете? – lmm

+0

yes @Imm любая идея, как это работает? делает ли компилятор только если LHS является потомком AnyRef и не следует обычной проверке типа? –

+0

Что-то вроде этого: https://github.com/scala/scala/blob/3c7b1e3d953703582aae81506f8b27732a603bfe/src/compiler/scala/tools/nsc/backend/jvm/BTypes.scala#L320-L326 – dmitry

ответ

3

Обычно компилятор явно обрабатывает нижний тип соответствие, как в the excerpt from scala compiler:

... 
} else if (isNullType) { 
    if (other.isNothingType) false 
    else if (other.isPrimitive) false 
    else true // Null conforms to all classes (except Nothing) and arrays. 
} else if (isNothingType) { 
    true 
} else other match { 
... 
+0

, как сказано в документации Null и Nothing, не являются точными классами Bottom, и они не распространяют все классы AnyRef (если бы у них были все методы всего своего суперкласса, и это было бы супер беспорядочно). Это заявленное поведение просто имитируется системой типов. –

+0

Я думаю, что 'Nothing' используется только как тип, а не класс вообще, потому что не может быть экземпляров' Nothing'. «Null» является более «материальным» в этом смысле, но все же не является истинным классом. – dmitry

Смежные вопросы