我惊讶地发现在以下场景中:
interface X {
void f();
}
interface Y extends X { }
javac
将经历为 Y
生成包含 void f()
定义的字节码的麻烦!所以,反编译的代码看起来像这样:
interface X {
void f();
}
interface Y extends X {
void f();
}
这对我来说没有多大意义,因为它看起来纯粹是多余的。 另外,如果稍后重命名
X.f()
和 X
和 Y
位于不同的项目中,现在这可能会产生运行时问题,因为 Y
仍然有 f()
的定义浮动?
OTOH,我能看到的唯一优点是调用代码实际上不需要了解
X
,但我猜 javac
或 java
永远不会允许您编译或运行引用 X
且类路径中没有可用 X
的代码。我说得对吗?
编辑: 这是用
javac Main.java
on 编译的
openjdk version "11.0.20" 2023-07-18
OpenJDK Runtime Environment Temurin-11.0.20+8 (build 11.0.20+8)
OpenJDK 64-Bit Server VM Temurin-11.0.20+8 (build 11.0.20+8, mixed mode)
有人可以解释一下吗?