Давайте сначала посмотрим, что делает Java:
dcs@dcs-132-CK-NF79:~/tmp$ ls *.java
BaseClass.java Test.java
dcs@dcs-132-CK-NF79:~/tmp$ ls *.class
ls: cannot access *.class: No such file or directory
dcs@dcs-132-CK-NF79:~/tmp$ javac -cp . Test.java
dcs@dcs-132-CK-NF79:~/tmp$ ls *.class
BaseClass.class Test.class
Итак, как вы можете видеть, Java фактически компилирует BaseClass
автоматически , когда вы это делаете. Возникает вопрос: как это можно сделать? Может ли он знать, какой файл для компиляции?
Ну, когда вы пишете extends BaseClass
на Java, вы на самом деле знаете несколько вещей. Вы знаете каталог, в котором находятся эти файлы, по имени пакета. Он также знает, что BaseClass
находится либо в текущем файле, либо в файле с именем BaseClass.java
. Если вы сомневаетесь в каком-либо из этих фактов, попробуйте переместить файл из каталога или переименовать его и посмотреть, может ли Java скомпилировать его.
Так почему же Scala не может сделать то же самое? Потому что это не предполагает ничего! Файлы Scala могут находиться в любом каталоге, независимо от пакета, который они объявляют. Фактически, один файл Scala может даже объявить более одного пакета, что сделает правило каталога невозможным. Кроме того, класс Scala может находиться в любом файле независимо от его имени.
Итак, хотя Java диктует вам, в каком каталоге должен находиться файл и как он называется, а затем извлекает выгоду, позволяя опускать имена файлов из командной строки javac
, Scala позволяет вам организовать свой код в любым способом, который вам кажется лучшим, но требует, чтобы вы указали, где находится этот код.
Выберите.