2024 Clojure状态调查!中分享您的看法。

欢迎!请参阅关于页面,了解更多关于如何使用本站的信息。

+5
Clojure
编辑

给定一个接口

public interface Foo {
    void bar(Object o);
}

以及在接口上的代理

(proxy [Foo] []
  (bar [o] (baz o)))

当接口更新到

public interface Foo {
  void bar(Object o);

  // java 8 default method, quote from 
  // https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html
  // "Default methods enable you to add new functionality to the
  // interfaces of your libraries and ensure binary compatibility
  // with code written for older versions of those interfaces."
  default void bar(Object o, Object p) {
    bar(o);
  }
}

instanceCreatedByProxy.bar(o, p) 的调用可能不会按预期工作。

reify 不受此影响。

重播存储库:https://github.com/imrekoszo/proxy-default


文档中没有任何关于这种行为的信息 在 `proxy` 的docstring中,我唯一看到的参考是一个 clojuredocs上的示例


这很麻烦,因为它可能会阻止本应非破坏性的库升级。如果调用 proxy 的代码处于控制之下,可以使用 reify 来替代(特别是因为这在 官方文档中被推荐)。然而,如果这是外部库,这并不是一个可行的解决方案。

这是否是 `proxy` 的一个bug或已知的局限性?
如果是后者,那么是否可以通过文档中的警告等方式使这一点更加明显?


编辑
- 原始Slack线程链接
- 添加对 `reify` 推荐的链接

2 个答案

0

被选中
 
最佳回答
感谢Alex。

我已更新重现问题的仓库,试图回答Ghadi Shayban在那提出的问题,但我似乎无法对问题发表评论。

这似乎也会在向接口添加其他默认方法时出现错误: https://github.com/imrekoszo/proxy-default/commit/6a2ddd2a5febdadc85adfb44957c0f010ebe7419
...