Скомпилированные интерфейсы в Java - PullRequest
0 голосов
/ 11 октября 2011

Я только что узнал об этом, и я надеюсь, что кто-то знает, что происходит. Следующие команды (запустите это во временном каталоге, предварительно очистив все):

Нет проблем:

cat << EOF > Myface.java
public interface Myface {}
EOF

cat << EOF > Myclass.java
public class Myclass implements Myface {}
EOF

javac Myface.java
javac Myclass.java

Myclass не будет компилироваться:

cat << EOF > Myface.java
package Mypackage;
public interface Myface {}
EOF

cat << EOF > Myclass.java
package Mypackage;
public class Myclass implements Myface {}
EOF

javac Myface.java
javac Myclass.java

Myclass НЕ СОБИРАЕТСЯ:

cat << EOF > Myface.java
package Mypackage;
public interface Myface {}
EOF

cat << EOF > Myclass.java
package Mypackage;
public class Myclass implements Myface {}
EOF

javac Myclass.java

Что здесь происходит?

РЕДАКТИРОВАТЬ: Все команды, выполните:

javatest@l-bel-smai-ubuntu:~$ ls
javatest@l-bel-smai-ubuntu:~$ pwd
/home/javatest
javatest@l-bel-smai-ubuntu:~$ cat << EOF > Myface.java
> public interface Myface {}
> EOF
javatest@l-bel-smai-ubuntu:~$ 
javatest@l-bel-smai-ubuntu:~$ cat << EOF > Myclass.java
> public class Myclass implements Myface {}
> EOF
javatest@l-bel-smai-ubuntu:~$ 
javatest@l-bel-smai-ubuntu:~$ javac Myface.java
javatest@l-bel-smai-ubuntu:~$ javac Myclass.java
javatest@l-bel-smai-ubuntu:~$ ls
Myclass.class  Myclass.java  Myface.class  Myface.java
javatest@l-bel-smai-ubuntu:~$ rm *
javatest@l-bel-smai-ubuntu:~$ cat << EOF > Myface.java
> package Mypackage;
> public interface Myface {}
> EOF
javatest@l-bel-smai-ubuntu:~$ 
javatest@l-bel-smai-ubuntu:~$ cat << EOF > Myclass.java
> package Mypackage;
> public class Myclass implements Myface {}
> EOF
javatest@l-bel-smai-ubuntu:~$ 
javatest@l-bel-smai-ubuntu:~$ javac Myface.java
javatest@l-bel-smai-ubuntu:~$ javac Myclass.java
Myclass.java:2: cannot find symbol
symbol: class Myface
public class Myclass implements Myface {}
                                ^
1 error
javatest@l-bel-smai-ubuntu:~$ rm *
javatest@l-bel-smai-ubuntu:~$ cat << EOF > Myface.java
> package Mypackage;
> public interface Myface {}
> EOF
javatest@l-bel-smai-ubuntu:~$ 
javatest@l-bel-smai-ubuntu:~$ cat << EOF > Myclass.java
> package Mypackage;
> public class Myclass implements Myface {}
> EOF
javatest@l-bel-smai-ubuntu:~$ 
javatest@l-bel-smai-ubuntu:~$ javac Myclass.java
Myclass.java:2: cannot find symbol
symbol: class Myface
public class Myclass implements Myface {}
                                ^
1 error
javatest@l-bel-smai-ubuntu:~$ 

Ответы [ 3 ]

1 голос
/ 11 октября 2011

Да, мы идем: Структура каталогов файлов Java / Class должна соответствовать структуре пакета, в которой объявлены классы Java, для правильной работы компиляции и загрузки классов.

0 голосов
/ 11 октября 2011

Случай 2: Когда вы компилируете Myclass.java, javac будет искать Mypackage/Myface.class. Это не там. Вы должны скомпилировать с javac -d ., что делает javac, чтобы создать соответствующую структуру каталогов для классов, которые он генерирует. Это также подразумевается в пути поиска для следующего javac вызова.

Случай 3: Когда вы компилируете Myclass.java, он будет искать Mypackage/Myface.class, затем подходящий исходный файл, указанный в командной строке, а затем подходящий исходный файл в Mypackage/Myface.java. Ни один не существует. Либо скомпилируйте с javac -d Myface.java Myclass.java, либо вставьте *.java в соответствующую структуру каталогов, указанную в именах пакетов.

0 голосов
/ 11 октября 2011

При компиляции Myclass.java добавьте параметр classpath

javac -classpath . Myclass.java
...