请在 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 的文档字符串 提到这种行为的指示,我唯一看到的是在 clojuredocs 上的一个示例


这很麻烦,因为它可能会阻止库的升级。如果调用 proxy 的代码受您控制,他们可以使用 reify 代替(尤其是在官方文档 中推荐这样做)。然而,如果它在外部库中,这不是一个可行的解决方案。

这是缺陷还是 proxy 的已知限制?
如果是后者,那么也许可以通过在文档字符串中添加警告来使其更加明显?


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

2 答案

0

选择
感谢Alex。

我更新了重现repo以尝试回答Ghadi Shayban在该处的问题,但似乎无法对该问题发表评论。

当将其他默认方法添加到接口时,这似乎也会中断: https://github.com/imrekoszo/proxy-default/commit/6a2ddd2a5febdadc85adfb44957c0f010ebe7419
...