Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Java中扩展方法的实际用途是什么?_C#_Java_Extension Methods - Fatal编程技术网

C# Java中扩展方法的实际用途是什么?

C# Java中扩展方法的实际用途是什么?,c#,java,extension-methods,C#,Java,Extension Methods,我理解C#扩展方法,因为它们允许您向已经关闭的类定义中添加新方法。Java defender/扩展方法似乎完全不同。例如: public interface Interfacable { public void regular(); public default void defender() { System.out.println("I am protected"); }; } 好的,我知道你可以用Java扩展方法做“trait-y”的事情,但是我不明白为什么它被称为相同的

我理解C#扩展方法,因为它们允许您向已经关闭的类定义中添加新方法。Java defender/扩展方法似乎完全不同。例如:

public interface Interfacable {
    public void regular();
    public default void defender() { System.out.println("I am protected"); };
}

好的,我知道你可以用Java扩展方法做“trait-y”的事情,但是我不明白为什么它被称为相同的事情(“扩展”),如果它看起来,呃,不做相同的事情。有人能帮我解决这个问题吗?

添加这些的原因是在Java中添加闭包的一部分,这样就有了一个简单的升级路径,比如集合类。添加闭包的挑战是,现在有很多函数需要添加到标准集合中。但是,如果将这些添加到现有接口中,则会破坏这些接口的任何实现。解决这个问题的一种方法是使用新方法添加一个额外的接口。这在没有虚拟扩展方法的情况下是可能的,但是,它有自己的缺点。也就是说,需要先添加新接口的实现,然后才能使用它。因为现在可能有很多实现,所以升级所有这些实现可能需要很长时间。然而,同时,您想要添加的方法对于实现来说是相当不可知的。至少在基本情况下,他们应该做基本相同的事情。构建此模型的团队决定处理此案例的方式是启用可重写的默认行为的规范。这样,随着接口的添加,功能就在那里,这取决于库编写者是否决定要编写一个不同的实现。关键是他们不必这样做,或者在他们这样做之前有一个权宜之计

长短不一的是,它们的行为基本上类似于特征,你是对的,它们与C#中的扩展方法不同。从我所读到的内容来看,这个最初的实现更像是C#。但是,由于样式的限制(即无法覆盖功能)以及无法使用反射,因此决定以这种方式使用它们确实会发现它们。尽管实现方法发生了变化,但名称似乎仍然存在


有关完整详细信息,请参阅解释虚拟扩展方法。

这不会编译。有一种面向方面的编程(AOP),听起来像你想要的,但不是你想要的?你在使用Java-8吗?不,Java 7是最后一个发布的版本。如果您想讨论Java8,您应该在问题中指定它。但是,严肃地说,Java-8仍然是Java,而且显然Java-7没有扩展方法。这两个功能非常不同,每个都有自己的优点。目前我们还不知道Java的“默认方法”可以用于什么用途。C#的扩展方法显然也是非常有用的。希望Java最终也会复制C#的特性,C#也会复制Java的特性。我想现在它被简单地称为“默认方法”