Как черта NotNull работает в версии 2.8 и действительно ли кто-нибудь ее использует?

trait NotNull {}

Я пытался понять, как эта черта может гарантировать, что что-то не является нулевым, и я не могу этого понять:

def main(args: Array[String]) {
  val i = List(1, 2) 
  foo(i) //(*)
}

def foo(a: Any) = println(a.hashCode)

def foo(@NotNull a: Any) = println(a.hashCode) //compile error: trait NotNull is abstract

def foo(a: Any with NotNull) = println(a.hashCode) //compile error: type mismatch at (*)

И:

val i = new Object with NotNull //compile-error illegal inheritance

Очевидно, существует некоторая особая обработка компилятора, потому что он компилируется:

trait MyTrait {}

def main(args: Array[String]) {
  val i: MyTrait = null
  println(i)
}

В то время как это не так:

def main(args: Array[String]) {
  val i: NotNull = null //compile error: found Null(null) required NotNull
  println(i)
} 

РЕДАКТИРОВАТЬ: я ничего об этом не могу найти в программировании на Scala


person oxbow_lakes    schedule 25.02.2010    source источник
comment
val a: NotNull = asdf. Вызывает сбой компилятора 2.7.5: исключение в основном потоке java.lang.AssertionError: утверждение не выполнено: введите ошибку r: невозможно преобразовать из REFERENCE (java.lang.String) в REFERENCE (scala.NotNull) в модуле ‹console›   -  person Thomas Jung    schedule 25.02.2010
comment
NotNull пока действительно не работает. Насколько мне известно, это работа, во многом похожая на Manifest в Scala 2.7.   -  person Daniel C. Sobral    schedule 25.02.2010
comment
@Daniel - ну, в соответствии с документами он был на языке с версии 2.5, поэтому я думаю, что он должен работать сейчас, или просто удалите!   -  person oxbow_lakes    schedule 25.02.2010
comment
Начато 01.05.07: lampvn.epfl.ch/trac/scala/changeset/10892   -  person Thomas Jung    schedule 25.02.2010
comment
Это понятно, но, насколько мне известно, они действительно хотят иметь это в удобной форме. Опять же, я могу совершенно ошибаться.   -  person Daniel C. Sobral    schedule 26.02.2010
comment
Похоже, что NotNull устарел: issues.scala-lang.org/browse/SI- 7247   -  person Mike Morearty    schedule 30.06.2013


Ответы (2)


Попробуй и сделай ошибку:

scala> class A extends NotNull
defined class A

scala> val a : A = null
<console>:5: error: type mismatch;
 found   : Null(null)
 required: A
       val a : A = null
                   ^

scala> class B
defined class B

scala> val b : B = null
b: B = null

Это работает только с Scala 2.7.5:

scala> new Object with NotNull
res1: java.lang.Object with NotNull = $anon$1@39859

scala> val i = new Object with NotNull
i: java.lang.Object with NotNull = $anon$1@d39c9f

И справочник по языку Scala:

Если этот член имеет тип, соответствующий scala.NotNull, значение члена должно быть инициализировано значением, отличным от null, в противном случае выдается scala.UnitializedError.

Для каждого типа класса T, такого что T ‹: scala.AnyRef, а не T‹: scala.NotNull, есть scala.Null ‹: T.

person Thomas Jung    schedule 25.02.2010
comment
Итак, следствие из этого. Почему собственные классы scala (например, List не расширяют черту NotNull? - person oxbow_lakes; 25.02.2010
comment
И еще один вопрос: какую черту вы используете? - person oxbow_lakes; 25.02.2010
comment
Если вы реализуете черты Scala в Java (и других языках), черта NotNull будет проигнорирована. Другой аспект заключается в том, что аннотация @NotNull и статический анализ кода будут в Java 7. Не вижу других причин не использовать их в библиотеках Scala. - person Thomas Jung; 25.02.2010
comment
Вы используете эту черту? Нет. Пропустили эту часть вопроса. - person Thomas Jung; 25.02.2010

NotNull еще не закончен. Намерение состоит в том, чтобы превратить это в удобный способ проверки ненулевого значения, но его еще нет. На данный момент я бы не стал им пользоваться. У меня нет конкретных прогнозов, когда это будет сделано, только то, что он не появится в версии 2.8.0.

person Martin Odersky    schedule 04.03.2010
comment
Правильно ли я говорю, что он находится в библиотеке / языке с 2.5? Это не очень хорошо отражает то, что в scala есть функции, которые просто не работают. - person oxbow_lakes; 05.03.2010
comment
Хотя я не могу ответить, можно ли было использовать его в 2.9.1, я могу добавить, что он устарел с 2.11.0, планируется удалить, но все еще находится в 2.12.6, и в настоящее время он удален в ветке 2.13 на GitHub. - person Adowrath; 13.08.2018
comment
Дополнение: он был удален из PR # 5683, включенного в 2.13.0 Milestone 1 с апреля 2017 г .: github .com / scala / scala / pull / 5683. - person Adowrath; 13.08.2018