给一个接口和该接口的代理
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
推荐的链接