Я использую модульную систему Java 9. Ниже приведен упрощенный вариант моей проблемы.
Я определил ClassA
(в модуле com.foo
) для реализации InterfaceB
(в модуле com.bar
). ClassA
реализует метод print
из InterfaceB
, который принимает параметр типа ClassC
(в модуле com.baz
). Ниже приведен код.
// src/a/com/foo/ClassA.java
package com.foo;
import com.bar.InterfaceB;
import com.baz.ClassC;
public class ClassA implements InterfaceB {
@Override
public void print(ClassC obj) {
System.out.println(obj);
}
}
// src/b/com/bar/InterfaceB.java
package com.bar;
import com.baz.ClassC;
public interface InterfaceB {
public void print(ClassC obj);
}
// src/c/com/baz/ClassC.java
package com.baz;
public class ClassC {
@Override
public String toString() {
return "This is a ClassC object";
}
}
Модуль com.baz
ничего не экспортирует. Итак, чтобы получить доступ к ClassC
во время компиляции InterfaceB
и ClassA
, я использую флаг --add-exports
.
InterfaceB
успешно компилируется, но когда я пытаюсь скомпилировать ClassA
, я получаю сообщение об ошибке:
src/a/com/foo/ClassA.java:6: ClassA is not abstract and does not override abstract method print(ClassC) in InterfaceB
Компилятор каким-то образом использует разные экземпляры ClassC
? У меня такое чувство, что с --add-exports
происходит что-то неожиданное.
(Кстати, причина, по которой я использую --add-exports
, заключается в том, что в моем примере com.baz
на самом деле является внутренним пакетом JDK. Я не могу изменить настройки модуля для его экспорта.)