有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

定义接口中的java默认方法

我在研究lambada,有一点表明,在java8中,我们可以在接口中声明一个定义类似的方法

interface Test {
                default String method(){
                        return "string";
                                       }
               }

根据规范,我们可以使用两种具有相同签名的方法,但取决于程序员如何使用它? 现在的问题是,如果使用定义而不是声明来完成同样的任务,那么使用默认方法有什么意义呢

就像它们的行为和常规方法定义一样,程序员需要声明主体和休息部分吗

实际的要点是什么,因为它似乎有点难以理解


共 (1) 个答案

  1. # 1 楼答案

    感谢@ElliottFrisch和@kagemusha在搜索后给我的提示,我得到了answer

    为什么使用默认方法

    List<?> list = …
    list.forEach(…); // lambda code goes here
    

    forEach不是由java声明的。util。也不要列出java。util。收集接口还没有。一个显而易见的解决方案是将新方法添加到现有接口中,并在JDK中提供所需的实现。然而,一旦发布,在不破坏现有实现的情况下向接口添加方法是不可能的

    因此,如果我们在Java8中有lambdas,但不能将其与标准集合库一起使用,那将非常令人沮丧,因为不能牺牲向后兼容性

    由于上述问题,引入了一个新概念。虚拟扩展方法,或者通常被称为defender方法,现在可以添加到提供声明行为的默认实现的接口中

    简单地说,Java中的接口现在可以实现方法。默认方法带来的好处是,现在可以向接口添加新的默认方法,并且不会破坏实现

    It doesn’t seem to be the language feature that would be appropriate to use every day, but it seems to be essential for Java Collections API update to be able to use lambdas naturally.