【问题标题】:Why does Java have virtual and not static extension methods like C#? [closed]为什么Java有像C#这样的虚拟而不是静态的扩展方法? [关闭]
【发布时间】:2014-03-12 16:29:32
【问题描述】:

Java 语言设计者决定使用虚拟扩展方法而不是像 C# 这样的静态扩展方法。静态扩展方法可能会导致与未来方法的命名冲突,但接口可以保持不变。

那么在 Java 中使用虚拟扩展方法的原因是什么?

【问题讨论】:

  • 我相信它们的用途完全不同,并且仅按名称相关,所以这个问题没有任何意义。
  • @AntP 在 C# 中引入了静态扩展方法,以解决与 Java 中的虚拟扩展方法相同的问题。
  • 你有这方面的参考吗?因为根据我正在阅读的有关 Java 中的虚拟扩展方法的内容,很明显它们肯定不是。完全没有。甚至远程也不行。虚拟扩展方法为接口实现者提供方法的默认实现,以防御未来版本的语言(或其他 API,我猜),这与 C# 扩展方法的作用无关。
  • “静态扩展方法可能导致与未来方法的命名冲突” - 你能澄清一下吗?请注意,在名称解析期间类方法优先于扩展,因此类稍后可以决定自己实现一些扩展方法(即,这是对某些类型进行 LINQ 优化的方式 - 类可以实现 Where 以“覆盖”Enumerable.Where 扩展方法)

标签: c# java extension-methods java-8


【解决方案1】:

正如我在 cmets 中提到的,这些东西有两个完全不相关的目的。他们唯一的共同点就是名字。

Java 虚拟扩展方法允许接口声明方法的默认实现。例如,如果您发布了一个新版本的 API,该 API 具有额外的接口方法,但不想破坏您的 API 用户对该接口的所有实现 - 即为了向后兼容,这将非常有用。

C# 扩展方法只是静态方法的一种方便语法,所以不要这样做:

MyStaticMethod(someObject, someOtherObject);

你可以这样做:

someObject.MyStaticMethod(someOtherObject);

无需实际更改someObject 的类实现。 C# 扩展方法与满足接口定义无关不能用于实现此目标)。

这两件事完全不同。

【讨论】:

  • +1。虚拟扩展方法(默认方法)的主要目标是促进接口演化。 Java 8 中的主要用例是向现有集合库添加流支持。 Java 8 库中还有其他几个示例。
猜你喜欢
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多