java - 为什么JVM在解析非接口(interface)方法时会考虑超接口(interface)? (JVM 5.4.3.3)

标签 java jvm

JVM 规范 (5.4.3.3) 描述了如何为方法引用完成方法解析。如果它在一个类或其父类(super class)中找不到方法,它会尝试在超接口(interface)中找到该方法。

这是什么原因?由超接口(interface)声明的方法不会作为接口(interface)方法引用而不是方法引用列在常量池中吗?

我的理解是方法引用用于 invokevirtual操作,而接口(interface)方法 refs 用于 invokeinterface操作。我看不出如何使用 invokevirtual <methodref> 调用接口(interface)方法。 .

最佳答案

为什么不?

您可以调用 .stream()ArrayList<>正好。事实上,下面的片段

ArrayList<Object> arr = new ArrayList<>();
arr.stream();

将被编译为
     0: new           #16                 // class java/util/ArrayList
     3: dup
     4: invokespecial #18                 // Method java/util/ArrayList."<init>":()V
     7: astore_1
     8: aload_1
     9: invokevirtual #19                 // Method java/util/ArrayList.stream:()Ljava/util/stream/Stream;

但是ArrayList<> (或其任何父类(super class))没有 .stream()方法。
使用的方法实现来自 interface Collection :
default Stream<E> stream() {
    return StreamSupport.stream(spliterator(), false);
}

但是,如果在任何时候,ArrayList<>决定它可以提供更好的.stream()方法,那么你不想再次编译你的代码。
还有 .stream() 的实现(或非实现)方法会泄漏,最好避免这种情况。

关于java - 为什么JVM在解析非接口(interface)方法时会考虑超接口(interface)? (JVM 5.4.3.3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61394872/

相关文章:

java - java中通过删除进行类型参数化是什么意思?

java - 无用的测试指令?

java - 如何使用服务器上的 -Dlog4j.configuration=file :/path/to/log4j. 属性运行我的 flink 作业

java - 字节类型行为不是预期的

java - 如何创建自定义适配器以使用cardview作为 fragment 内的 ListView

java - JBOSS AS7.2 启动问题 : Doesnot delpoy?

java - 共享常量池?

java - 在抽象父类中重写 toString() 是个好主意吗?

java - 如果在属性文件中找不到属性,则打印系统属性名称

java - 测量花费在 GC 上的时间