我正在使用 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模块不导出任何内容。因此,为了在 and 的编译期间访问,ClassC我使用了标志。InterfaceBClassA--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 包。我无法修改模块设置来导出它。)