Какие функции Scala нельзя перевести на Java? - PullRequest
9 голосов
/ 29 ноября 2010

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

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

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

Ответы [ 8 ]

11 голосов
/ 29 ноября 2010

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

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

10 голосов
/ 29 ноября 2010

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

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

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

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

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

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

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

4 голосов
/ 30 ноября 2010

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

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

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

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

Существует множество SO-страниц с дополнительной информацией, например, эта .

4 голосов
/ 29 ноября 2010

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

4 голосов
/ 29 ноября 2010

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

Например, мы создаем одну собаку, которая голодна и хочет пить, и одну собаку, которая просто голодна.

val hungryThirstyDog = new Dog with Hungry with Thirsty
val onlyHungryDog = new Dog with Hungry

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

3 голосов
/ 30 ноября 2010

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

0 голосов
/ 17 января 2011

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

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

0 голосов
/ 05 декабря 2010

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

...