Этот вопрос, на мой взгляд, упускает из виду тот факт, что мы просили нас сравнить языки 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-земле.