以前不可以写static 方法应该算是个bug吧?默认方法的加入,相当于多继承,以及更合理,比如addAll默认调用add
恩
addAll默认调用add是什么意思
默认方法带来的优点就是多继承,一可以少写代码,例如
interface MyService<T> { /**添加一个*/ void add(T item); /**添加多个*/ default void addAll(T[] items) { for (T item : items) { add(item); } } }
实现MyService#add的类可以少写addAll方法,二能力化,例如
public interface ToJSON { default String toJSON() { return JSON.toJSONString (this); } }
只要继承ToJSON就可以直接使用toJSON.
当然缺点也很明显,Java曾号称纯的面向对象编程,接口应是一种抽象协议不能有具体的实现,接口默认方法破坏了面向对象的编程,一歧义性,接口是平级继承的,例如
interface MyInter1 { default void sayOK() { System.out.println("OK1"); } } interface MyInter2 { default void sayOK() { System.out.println("OK2"); } } static class MyClass implements MyInter1,MyInter2 { }
那么对于MyClass来说sayOK存在歧义,到底是调用MyInter1还是MyInter2呢?jdk<8接口方法没有具体内容,就不会存在这种问题。二与class的作用定义混乱,既然interface可以有默认方法,私有方法,这跟class有什么区别呢?还不如放弃interface呢
@TCG2008: 我刚才试了一下
MyClass implements MyInter1,MyInter2
这时候eclipse会提示,让你选择一个实现
在实际的开发中会出现2个接口具有相同方法名的情况吗?
就例如MyInter1和MyInter2
如果出现这种情况直接实现一个就好了
是不是