Java中缺省方法会引入多重继承吗?
不会,因为多重继承已经存在于Java中了。接口类型的多重继承从一开始一直是语言的一个特点。缺省方法确实引入了一种新的多重继承即多重继承行为。Java将依然不会有多重继承的状态,就像C++那样。
这里是多重继承行为的一个例子。新的接口java.util.Sized声明了方法size和sEmpty并提供了后者的默认实现:
新接口java.util.Traversable<T>声明了方法forEach并提供了一个默认的实现:
假设我们现在声明一个类SimpleCollection<T>并为其提供iterator和size的实现:
[img]http://www.lambdafaq.org/wp-content/uploads/MultipleInheritanceWithMethods.png[/img]
然后,给定一个声明
编译下面的语句:
原文链接:http://www.lambdafaq.org/do-default-methods-introduce-multiple-inheritance-to-java/
不会,因为多重继承已经存在于Java中了。接口类型的多重继承从一开始一直是语言的一个特点。缺省方法确实引入了一种新的多重继承即多重继承行为。Java将依然不会有多重继承的状态,就像C++那样。
这里是多重继承行为的一个例子。新的接口java.util.Sized声明了方法size和sEmpty并提供了后者的默认实现:
public interface Sized {
public default boolean isEmpty() {
return size() == 0;
}
public int size();
}
新接口java.util.Traversable<T>声明了方法forEach并提供了一个默认的实现:
public interface Traversable<T> {
public default void forEach(Block<? super T> block) {
for (T t : this) {
block.apply(t);
}
}
}
假设我们现在声明一个类SimpleCollection<T>并为其提供iterator和size的实现:
[img]http://www.lambdafaq.org/wp-content/uploads/MultipleInheritanceWithMethods.png[/img]
class SimpleCollection<T> implements Sized, Traversable<T> {
public Iterator<T> iterator() { ... }
public int size() { ... }
}
然后,给定一个声明
SimpleCollection<String> sc = new SimpleCollection<>();
编译下面的语句:
Sized s = sc; // SimpleCollection是Sized的子类型
Traversable<String> t = sc; // SimpleCollection是Traversable的子类型
System.out.println(sc.isEmpty()); // isEmpty是来自Sized接口缺省实现
sc.forEach(System.out::println); // forEach是来自Traversable的缺省实现
原文链接:http://www.lambdafaq.org/do-default-methods-introduce-multiple-inheritance-to-java/