在Java中,为什么接口“B extends A”会让javac在B上生成A的所有方法?

问题描述 投票:0回答:0

我惊讶地发现在以下场景中:

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)

有人可以解释一下吗?

java javac bytecode
© www.soinside.com 2019 - 2024. All rights reserved.