Почему Scala Option [T] не переводит непосредственно в T в байт-код?

Одна вещь, которую я не понимаю о Scala, - это то, почему Null подклассифицирует все, несмотря на то, что не прошел тест замены. Предположительно, это для совместимости с Java, и я думаю, что это нормально, но затем Scala нажимает шаблон Option [T].

Это я не понимаю. Опция [T] не дает вам никаких дополнительных гарантий (так как каждый T является опцией defacto). Но он также составляет в общей сложности 4 состояния:

val a: Option[String] = null
val b: Option[String] = Some(null)
val c: Option[String] = None
val d: Option[String] = Some("A string")

Это кажется неэффективным (от байт-кода pov) и, возможно, даже хуже, чем просто боль Java. Каков мой вопрос: почему бы не Scala сделать Option [T] особым случаем, который переводится непосредственно в байт-код T Java. Все сопряжение с кодом Java (использующим ссылки) должно быть через этот параметр [T] ( который действительно, это именно то, что есть). И будет аннотация или что-то еще, если метод Scala работает с T, который не может быть None.

Это кажется наиболее очевидным правилом, наиболее типичным и наиболее эффективным.

Спасибо

Ответ 1

Существует три причины:

  • Scala - это тонкая оболочка, которая только добавляет новые вещи, и они не хотят нарушать это.
  • Они не хотят превращать библиотеки Java в боль, чтобы использовать их, потому что все аргументы будут тогда Option [T] вместо T.
  • Они не хотят использовать использование имен или аннотаций для различения библиотек, написанных в Scala, и написанных на Java (для обозначения метода как взятия "ссылки, не содержащей NULL" ).

Ответ 2

Основной причиной для опции является поддержка любого типа, который может быть AnyVal или AnyRef. Scala требует, чтобы AnyVal не мог быть null. Это означает, что параметр типа T не может быть просто равен нулю. Это затрудняет использование дженериков в библиотеках, таких как библиотека коллекций Scala, без чего-то вроде Option.

val n: Option[Int] = Some(null) // will not compile

Я считаю, что вы правы, что существует множество возможных оптимизаций для устранения опции, которая может исключить фактическое использование класса на уровне байтового кода. Существует возможность включить агрессивные оптимизации для компилятора Scala, который может сделать именно это, но он все еще сильно работает.

Ответ 3

Neil ответ довольно хороший, но я хотел бы добавить еще один фактор. Option не является частью языка, это просто библиотека. Как бы вы реализовали то, что вы предлагаете?

Кроме того, хотя я не думаю, что это большая сделка, вы можете отобразить тип Option, который просто не был бы, если бы он был просто сохранен как T.

Ответ 4

Поскольку Option является обычным типом, он может расширять черты, использовать логику отправки нормального метода, вы можете проверить его с помощью isInstanceOf и т.д.

Вам может быть интересен Kotlin, который делает в значительной степени то, что вы хотите, и должен быть выпущен в ближайшее время.