gpt4 book ai didi

java - 使用包含非导出参数类型的方法实现接口(interface)(Java 9 模块)

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:04:37 25 4
gpt4 key购买 nike

我正在使用 Java 9 模块系统。以下是我的问题的简化版本。

我已经定义了 ClassA(在模块 com.foo 中)来实现 InterfaceB(在模块 com.bar 中>). ClassA 实现了InterfaceBprint 方法,它接受一个类型为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 模块不导出任何内容。所以,为了在 InterfaceBClassA 的编译过程中访问 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 包.我无法修改模块设置来导出它。)

最佳答案

虽然确实有办法让模块系统编译你的代码(you found it already),但你会在运行时发现类似的问题,同样,代码调用 InterfaceB::print 不能访问 ClassC。同样,命令行标志可用于修复该问题。 但他们不应该这样做!

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

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

(如果不是所有模块都应该看到它,请考虑 qualified exports 。如果涉及反射,其他方法可能更适合并且应该提出一个新问题。)

关于java - 使用包含非导出参数类型的方法实现接口(interface)(Java 9 模块),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40923595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com