请在2024 Clojure 状况调查中分享您的想法!

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

+5
Clojure
编辑

给一个接口和该接口的代理

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

当接口更新时

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

调用instanceCreatedByProxy.bar(o, p)将不会像预期那样工作。

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);
  }
}

reify不受此影响。

proxy的文档字符串中没有提到此行为。

重现链接:[https://github.com/imrekoszo/proxy-default](https://github.com/imrekoszo/proxy-default)


proxy的文档字符串中没有任何行为指示,我看到的唯一参考是clojuredocs上的一个示例


这可能会阻止库的非破坏性升级。如果调用proxy的代码是由自己控制,则可以使用reify替代(尤其是因为在官方文档中被推荐)。然而,如果它位于外部库中,这不是可行的解决方案。

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


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

2 答案

0

选中
谢谢Alex。

我已经更新了repr repo以尝试回答Ghadi Shayban在该问题中的问题,但似乎无法在该问题上发表评论。

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