前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >什么是 default 方法

什么是 default 方法

作者头像
水货程序员
修改2018-12-03 16:41:34
1.5K0
修改2018-12-03 16:41:34
举报
文章被收录于专栏:javathingsjavathings

Java 设计者希望能在 List 上提供一个 forEach 方法,例如可以

list.forEach(System.out::println)

而 List<E> 实现自 Collection<E>,Collection<E> 实现自 Iterable<E>

如果 Collection 接口定义了 forEach 方法,那么所有实现了 Collection<E> 接口的子类都必须要实现一遍 forEach 方法,这会引发新老代码的兼容问题。

基于这种场景,出现了 default 方法。default 方法在接口中定义了一个实现,因此,继承者可以不需要再实现它了。实现该接口的类都能直接调用这个 default 方法。

当然,硬是要去实现他也是可以的,必须加上@Override 标注,例如:

Iterable<T> 接口中就定义了如下的 forEach 默认方法。

代码语言:javascript
复制
default void forEach(Consumer<? super T> action) {
    Objects.requireNonNull(action);
    for (T t : this) {
        action.accept(t);
    }
}

如果一个类,实现了 2 个接口,而这 2 个接口都有一个 default 方法,并且方法签名也相同,那么就会导致冲突。这个类在运行这个方法的时候,不知道该去调用哪个接口里的逻辑。

比如下面的代码。

接口 1

代码语言:javascript
复制
public interface myInterface {
    default int dosomething(int i,int j){
        return i+j;
    }
}

接口 2

代码语言:javascript
复制
public interface myInterface2 {
    default int dosomething(int i,int j){
        return i*j;
    }
}

类继承了接口 1 和接口 2

代码语言:javascript
复制
class myclass implements myInterface,myInterface2
{}

此时会编译报错,必须要显示的解决冲突,指定 dosomething 的逻辑。通常,如果需要按 myInterface 中的默认方法运行,只需要如下写就可以了。

代码语言:javascript
复制
class myclass implements myInterface,myInterface2
{
    @Override
    public int dosomething(int i, int j) {
        return myInterface.super.dosomething(i, j);
    }
}

当然,既不按 myInterface 也不按 myInterface2 也是可以的,由调用者决定如何实现该方法。

原创文章,转载请注明出处!https://cloud.tencent.com/developer/article/1361889

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档