与包含非导出参数类型的方法(Java 9模块)的接口实现

与包含非导出参数类型的方法(Java 9模块)的接口实现,java,java-9,java-platform-module-system,Java,Java 9,Java Platform Module System,我正在使用Java9模块系统。下面是我的问题的简化版本 我已经定义了ClassA(在模块com.foo)来实现InterfaceB(在模块com.bar)ClassA实现InterfaceB的print方法,该方法采用ClassC类型的参数(在模块com.baz中)。下面是代码 // src/a/com/foo/ClassA.java package com.foo; import com.bar.InterfaceB; import com.baz.ClassC; public class

我正在使用Java9模块系统。下面是我的问题的简化版本

我已经定义了
ClassA
(在模块
com.foo
)来实现
InterfaceB
(在模块
com.bar
ClassA
实现
InterfaceB
print
方法,该方法采用
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
模块不导出任何内容。因此,为了在编译
InterfaceB
ClassA
期间访问
ClassC
,我使用了
--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包。我无法修改模块设置以导出它。)

我仍然不确定为什么会发生错误,或者是否有意出错,但我找到了解决方案

编译
ClassA
时,同时将
com.baz
模块导出到
com.bar
(其中
InterfaceB
是)似乎允许编译器查看正确的
ClassC

e、 g


虽然确实有一些方法可以让模块系统编译代码(),但当代码调用
InterfaceB::print
无法访问
ClassC
时,您会在运行时发现类似的问题。同样,可以使用命令行标志来解决这个问题。但他们不应该

模块系统试图告诉你一些事情,在这里:“这个模块化被打破了!”

如果允许
com.baz
之外的任何模块使用
ClassC
,则应导出包含该模块的软件包!这正是出口的目的。其他代码显然依赖于
ClassC
,而模块系统的构建就是为了明确这些依赖关系。因此,除非您在练习中了解命令行覆盖,否则真正的解决方案是让com.baz导出
com.baz


(如果不是所有的模块都应该看到它,考虑。如果涉及到反射,其他方法可能更适合,一个新的问题应该被问。)/P>我简化了我的问题。未导出的包是内部JDK API的一部分,因此我无法更改其模块的设置以导出它们。有更好的方法吗?不,没有更简单的方法。这是故意的困难,因为你不应该这样做,除非人们的生命处于危险之中

-javac ... --add-exports com.baz/com.baz=com.foo,com.bar