首页 新闻 会员 周边

Java8新增的Interface里可以写静态方法和写一个默认的实现有什么意义吗?

0
[已解决问题] 解决于 2018-06-09 20:11

Java8新增的Interface里可以写静态方法和写一个默认的实现有什么意义吗?

问题补充:

Interface里可以直接写static方法

给我带来最大的便捷就是我不用重新创建一个工具类了,因为可以直接在接口里写就好了

renguanyu的主页 renguanyu | 小虾三级 | 园豆:838
提问于:2018-06-08 16:48
< >
分享
最佳答案
0

以前不可以写static 方法应该算是个bug吧?默认方法的加入,相当于多继承,以及更合理,比如addAll默认调用add

奖励园豆:5
TCG2008 | 小虾三级 |园豆:1150 | 2018-06-08 18:11

addAll默认调用add是什么意思

 

renguanyu | 园豆:838 (小虾三级) | 2018-06-09 11:14

默认方法带来的优点就是多继承,一可以少写代码,例如

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 | 园豆:1150 (小虾三级) | 2018-06-09 18:13

@TCG2008: 我刚才试了一下

MyClass implements MyInter1,MyInter2

这时候eclipse会提示,让你选择一个实现

 

在实际的开发中会出现2个接口具有相同方法名的情况吗?

就例如MyInter1和MyInter2

如果出现这种情况直接实现一个就好了

是不是

renguanyu | 园豆:838 (小虾三级) | 2018-06-09 20:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册