gpt4 book ai didi

Java的默认接口(interface)方法与私有(private)实例方法冲突?

转载 作者:行者123 更新时间:2023-12-01 18:06:59 24 4
gpt4 key购买 nike

据我所知,Java 8 新接口(interface)默认方法背后的主要思想是支持接口(interface)演进,即在不中断现有实现的情况下扩展接口(interface)。

但我刚刚想到的是,实际上 API 中的所有这些新的默认接口(interface)方法都有可能破坏现有代码。也就是说,如果在类中我实现接口(interface) X,并且该接口(interface) X 现在有一个新的默认方法,该方法与我的类中已经存在的某些私有(private)实例方法具有相同的签名,那么我的实现就会中断!因为在这种情况下,编译器认为我正在重写接口(interface)方法,同时降低其可见性,这是​​不允许的。那么,如果我有一些 Iterable 的实现并想出了一些私有(private)的 forEach 实用方法怎么办?不,当我更新到 Java 8 时,我无法再编译。

只有我对 Oracle 实际上发布了不完全向下兼容的 API 更新感到有点震惊吗?过去是否发生过这样的事情,升级到新的编译版本会使您的某些代码不再编译?因为如果是这样我不知道。您对此有何看法?

编辑:哦,等等,我说的可能有一个缺陷。我提到了 Iterable#forEach 方法的示例,但实际上,这个方法需要一些参数,这些参数也只在 Java 8 中引入。所以没有我之前就可以定义这样的方法。现在,我的下一个问题是:所有新的默认方法是否都采用某种新类型来保证它们不会与任何 Java-8 之前的现有实例方法发生冲突?

干杯

最佳答案

Oracle 必须在让语言和 API 停滞不前之间做出选择,或者冒一些向后不兼容的风险。是的,默认方法可能会导致现有的扩展接口(interface)和实现出现问题。这是众所周知的。

过去已经发生过这种情况吗?是的:JDBC 接口(interface)曾多次出现新方法。 assert不是一个关键字,但自 Java 1.4 等以来就是一个关键字。enum 1.5 之前不是关键字,等等。

编辑

向后不兼容的示例:

如果您有一个扩展 Collection 的接口(interface) MyCollection 并有一个方法 stream() ,它将与新的默认值 stream() 冲突方法,因为它具有相同的签名但返回类型不同。

如果您有扩展/实现的接口(interface)或类 List<E>并有一个方法void sort(Comparator<E> c) ,它将与新的默认方法 void sort(Comparator<? super E>) 冲突.

关于Java的默认接口(interface)方法与私有(private)实例方法冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35635687/

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