给定一个接口
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` 推荐的链接