3

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

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

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

4

1 回答 1

5

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

总而言之,它们基本上就像特征一样,你是对的,它们与 C# 中的扩展方法不同。从我读过的内容来看,这个的原始实现更多的是 C#。但是,由于样式的限制(即无法覆盖功能)和无法使用反射而决定以这种方式使用它们确实发现了它们。尽管实现的方法发生了变化,但名称似乎卡住了。

有关详细信息,请参阅解释虚拟扩展方法的文章。

于 2013-06-22T23:42:14.670 回答