Это очень поздно, но я в какой-то степени согласен с тем, что сказал oxbow_lakes. Недавно я перешел с Python на Scala, и знание того, как работает Java - особенно ограничения Java в отношении универсальных типов - помогло мне понять некоторые аспекты Scala.
У Java ужасно сломанная ошибка, известная как «стирание типа». Эта поломка, к сожалению, присутствует и в JVM. Это особенно касается программирования с универсальными типами - проблема, которая просто не возникает вообще в динамически типизированных языках, таких как Ruby и Python, но очень велика в статически типизированных языках. Scala справляется с этой задачей настолько хорошо, насколько может, но величина поломки означает, что часть ее неизбежно переходит в Scala. Кроме того, некоторые исправления в Scala для этой проблемы (например, манифесты) являются недавними и хакерскими и действительно требуют понимания того, что происходит под ними. Обратите внимание, что эта проблема поначалу, вероятно, не повлияет на ваше понимание Scala, но вы столкнетесь с ней, когда начнете писать реальные программы, использующие универсальные типы, поскольку есть вещи, которые вы попытаетесь сделать, но они просто не будут работать. , и вы не будете знать почему, если / пока не поймете ограничения, вызванные стиранием типа.
Рано или поздно вы также столкнетесь с проблемами, связанными с другой ошибкой Java, которая заключается в разделении типов на объекты (классы) и примитивных типов (целые числа, числа с плавающей запятой, логические значения) - и, в частности, тот факт, что примитивные типы не являются частью объектной системы. Scala на самом деле делает потрясающую работу, скрывая это от вас, но может быть полезно узнать о том, что делает Java в определенных угловых случаях, которые в противном случае могут быть сложными - особенно с использованием универсальных типов, в основном из-за прерывания стирания типов, описанного в # 1. (Стирание типов также приводит к значительному снижению производительности при использовании массивов, хеш-таблиц и аналогичных универсальных типов над примитивами; это одна из областей, в которой знание Java очень поможет.)
Несоответствие № 3 - массивы также обрабатываются специально и неортогонально в Java. В Scala это не так просто, как для примитивов, но гораздо лучше, чем для стирания типов. Механизм сокрытия иногда раскрывается (например, тип ArrayWrapper), что может иногда приводить к проблемам, но на удивление самая большая проблема на практике, опять же, связана с универсальными типами.
Параметры класса Scala и способ, которым Scala обрабатывает конструкторы классов. В этом случае Java не нарушена. Можно утверждать, что Scala тоже не подходит, но то, как он обрабатывает конструкторы классов, довольно необычно, и на практике мне было трудно это понять. Я действительно смог разобраться в поведении Scala, выяснив, как соответствующий код Scala переводится в Java (или, вернее, в скомпилированную Java), а затем обдумал, что будет делать Java. Поскольку я предполагаю, что в этом отношении Ruby во многом похож на Java, я не думаю, что у вас возникнет слишком много проблем, хотя вам, возможно, придется выполнить то же ментальное преобразование.
I / O. Это на самом деле проблема с библиотекой, а не языковая проблема. В большинстве случаев Scala предоставляет свои собственные библиотеки, но Scala на самом деле не имеет библиотеки ввода-вывода, поэтому у вас практически нет другого выбора, кроме как напрямую использовать библиотеку ввода-вывода Java. Для программистов на Python или Ruby этот переход немного болезненный, поскольку библиотека ввода-вывода в Java большая и громоздкая, и ее не так просто использовать для выполнения простых задач, например, перебирая все строки в файле.
Обратите внимание, что помимо ввода-вывода вам также необходимо использовать библиотеки Java напрямую для других случаев, когда вы взаимодействуете с ОС или связанными задачами, например, работа с временем и датами или получение переменных окружения, но обычно это не так сложно понять. Другие основные библиотеки Java, которые вам могут понадобиться: