Какие особенности Scala нельзя перевести на Java?


Компилятор Scala компилирует непосредственно байтовый код Java (или .NET CIL). Некоторые функции Scala можно было бы переделать в Java прямолинейно (например, простой для понимания, классы, перевод anonymous / inner function и т. д.). Каковы особенности, которые не могут быть переведены таким образом?

Это, по-видимому, в основном представляет академический интерес. Возможно, более полезно было бы узнать, какие ключевые функции или идиомы Scala, которые вы используете, не могут быть легко представлены в Java?

Есть ли а как насчет другого пути? Вещи, которые могут быть сделаны прямолинейно на Java, которые не имеют прямого эквивалента в Scala? Идиомы на Java, которые не переводятся?

8 9

8 ответов:

Этот вопрос, на мой взгляд, упускает из виду, прося нас сравнить языки JVM, глядя на их сгенерированный байт-код.

Scala компилируется в байт-код, эквивалентный Java. То есть байт-код мог быть сгенерирован кодом, написанным на Java. Действительно, Вы даже можете получить scalac для вывода промежуточной формы, которая очень похожа на Java.

Все функции, такие как признаки (через статические форвардеры), нелокальные возвраты (через исключения), ленивые значения (через ссылки) и т. д. Все они выражаются программой Java, хотя, возможно, самым уродливым образом!

Но то, что делает scala scala, а не Java, - это то, что scalac может сделать для вас, до того, как байт-код будет сгенерирован. То, что scalac имеет для него, как статически типизированный язык, - это возможность проверять программу на корректность, включая корректность типа (в соответствии с ее системой типов) во время компиляции.

Тогда основное различие между Java и scala (как конечно, Java также статически типизирована), следовательно, является системой типов scala, которая способна выражать программные отношения, которые система типов языка java не может.Например:

class Foo[M[_], A](m : M[A])
trait Bar[+A]

Этипонятия , что M является параметром типа, который сам имеет параметры типа, или что Bar является ковариантным, просто не существуют в Java-land.

Черты-это одна вещь, которая не имеет эквивалента. Черты-это интерфейсы с кодом в них. Вы можете скопировать код во все классы, в которых присутствует признак, но это не одно и то же.

Также я считаю, что система типа scala является более полной. В то время как он в конечном итоге будет соответствовать типам JVM (фактически страдает стиранием). Вы можете выразить некоторые вещи в системе типов Scala, которые могут быть невозможны в Java (например, вариации).

Я думаю, что нет эквивалента для динамического смешивания в некоторых чертах. В Scala вы можете добавлять во время создания новых объектов некоторые черты, которые смешиваются.

Например, мы создаем одну собаку, которая голодна и хочет пить, и одну собаку, которая просто голодна.
val hungryThirstyDog = new Dog with Hungry with Thirsty
val onlyHungryDog = new Dog with Hungry

Я не знаю эквивалентного способа сделать это в Java. В Java наследование определяется статически.

Неявные преобразования не имеют прямого эквивалента в Java.

Одной из особенностей scala, которую я нашел хорошее применение, является овеществление типа черезманифесты . Поскольку JVM удаляет всю информацию о типах из универсальных систем, scala позволяет сохранять эту информацию в переменных. Это то, что Java reflection AFAIK не может обработать, так как в байт-коде нет аргументов для типов.

Случай, когда они мне были нужны, состоял в том, чтобы найти совпадение по типу List. Это, у меня был Объект VertexBuffer, который хранил данные на GPU, которые могли быть строится из списка поплавков или целых чисел. Код Манифеста выглядел примерно так:

class VertexBuffer[T](data:List[T])(implicit m:Manifest[T]) {
  m.toString.match {
    case "float" => ...
    case "int" => ...
  }
}

Эта ссылка ссылается на сообщение в блоге с дополнительной информацией.

Есть много страниц SO с большей информацией, как эта.

Три слова: высшие типы рода.

Ваша тема не ясна, вы имеете в виду Java JVM или Java язык. Учитывая, что Scala работает на JVM, q не имеет смысла, поскольку мы все знаем, что Scala работает на JVM.

Scala имеет "родную" поддержку XML. Вы можете построить XML, найти элементы, сопоставить их непосредственно в коде Scala.

Примеры: http://programming-scala.labs.oreilly.com/ch10.html