我正在使用 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
我使用了标志。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 包。我无法修改模块设置来导出它。)