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