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 默认方法。
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
如果一个类,实现了 2 个接口,而这 2 个接口都有一个 default 方法,并且方法签名也相同,那么就会导致冲突。这个类在运行这个方法的时候,不知道该去调用哪个接口里的逻辑。
比如下面的代码。
接口 1
public interface myInterface {
default int dosomething(int i,int j){
return i+j;
}
}
接口 2
public interface myInterface2 {
default int dosomething(int i,int j){
return i*j;
}
}
类继承了接口 1 和接口 2
class myclass implements myInterface,myInterface2
{}
此时会编译报错,必须要显示的解决冲突,指定 dosomething 的逻辑。通常,如果需要按 myInterface 中的默认方法运行,只需要如下写就可以了。
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