2012-11-27 2 views
4

Поскольку я знаю немного Java, я пытался использовать в каждом коде Scala некоторые типы Java, такие как java.lang.Integer, java.lang.Character, java.lang.Boolean ... и так далее. Теперь люди сказали мне: «Нет! Для всего, что есть в Scala, есть собственный тип, Java-материал будет работать, но вы всегда должны выбирать типы и объекты Scala».Почему String отличается от Int, Boolean, Byte ... в scala?

Хорошо, теперь я вижу, в Скале есть все, что есть на Java. Не уверен, почему лучше использовать, например, Scala Boolean вместо Java Boolean, но отлично. Если я посмотрю на типы, я вижу scala.Boolean, scala.Int, scala.Byte ... и затем я смотрю на String, но его не scala.String, (ну его даже не java.lang.Stringconfuse) его просто строка. Но я думал, что должен использовать все, что приходит прямо из scala. Может быть, я не понимаю, правильно ли скала, может кто-нибудь объяснить это, пожалуйста?

+4

Возможно, эта тема поможет вам понять этот момент: http://stackoverflow.com/questions/6559938/scala-string-vs-java-lang-string-type-inference –

ответ

11

Во-первых, «это даже не утверждение java.lang.String» не совсем корректно. Обычная String название происходит от псевдонима типа, определенных в Predef объекта:

type String = java.lang.String 

и внутренности Predef импортируются в каждом источнике Scala, поэтому использовать String вместо полного java.lang.String, но на самом деле они такие же.

java.lang.String очень специальный класс, обработанный JVM специальным способом. Как сказал @ pagoda_5b, он объявлен как final, его невозможно продлить (и это на самом деле хорошо), поэтому библиотека Scala предоставляет оболочку (RichString) с дополнительными операциями и неявное преобразование String -> RichString по умолчанию.

Однако, есть несколько иная ситуация с Integer, Character, Boolean и т.д. Вы видите, даже если String обрабатывается специальным образом JVM, он все еще простой класс, экземпляры которого являются простыми объектами. Семантически это не отличается от, скажем, List класса.
Существует еще одна ситуация с примитивными типами.Java int, char, boolean Типы не являются классами, а значения этих типов не являются объектами. Но Scala - полностью объектно-ориентированный язык, нет примитивных типов. Можно было бы использовать java.lang.{Integer,Boolean,...} везде, где вам нужны соответствующие типы, но это было бы ужасно неэффективно из-за бокса.
Из-за этого Scala необходим способ представления примитивных типов Java в объектно-ориентированных настройках, и поэтому были введены классы scala.{Int,Boolean,...}. Эти типы обрабатываются специально с помощью компилятора Scala - scalac генерирует код, работающий с примитивами, когда он сталкивается с одним из этих классов. Они также расширяют класс AnyVal, что мешает вам использовать null в качестве значения для этих типов. Этот подход решает проблему с эффективностью, оставляет классы java.lang.{Integer,Boolean,...}, где вам действительно нужен бокс, а также предоставляет элегантный способ использования примитивов другой хост-системы (например, .NET runtime).

4

Я просто предполагаю здесь

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

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

Я полагаю, что java.lang.String потребовался другой подход, являющийся уже Object, и final в его реализации. Таким образом, «путь наименьшей боли» заключался в создании неявной Rich-обертки вокруг него, чтобы получить отсутствующие операции над String, оставив остальное нетронутым.

Чтобы увидеть это другим способом, java.lang.String был уже достаточно хорош как-есть, будучи неизменным и что-то еще.

Следует отметить, что другие «примитивные» типы в scala имеют свои собственные богатые обертки, которые обеспечивают дополнительные разумные операции.

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