我有一个使用Proxy
的课程。它看起来像这样:
public class BarWrapper
{
private final Bar bar;
public BarWrapper(Bar bar)
{
this.bar = bar;
}
public int someMethodInBar()
{
return bar.someMethodInBar();
}
public int someMethodInBar2()
{
return bar.someMethodInBar2();
}
public int someMethodInBar3()
{
return bar.someMethodInBar3();
}
// etc
}
Bar
是超级类,动态类型是衍生类。
我有一个接口,我希望包装器实现该接口并继续使用相同方法的代理,但Bar
本身不实现该接口,我没有任何访问权限。如何强制用户传递动态类型,该动态类型不仅是Bar
的衍生物,而且还实现了接口,因此我可以毫无困难地执行此操作:
(Iinterface)bar.interfaceMethod();
答案 0 :(得分:2)
如果你需要包装对象既是Bar的子类又是接口Foo的一个实例,那个Bar没有实现,那么我看到的唯一方法是接受实现Foo的Bar的子类:
public abstract FooBar extends Bar implements Foo {
}
这将做你想要的:用户将被迫扩展FooBar,从而提供实现Foo的Bar的子类。
答案 1 :(得分:1)
不接受对象Bar
,而只接受接口。
private final Iinterface bar;
public BarWrapper(Iinterface bar)
{
this.bar = bar;
}
这确实要求您的代理只调用接口中的方法。您也可以调用Bar
但不是Iinterface
的方法。在编译时强制执行该操作的唯一方法是将这些方法添加到接口,或者扩展接口:
public interface IinterfaceBarWrapper implements Iinterface
{
public void someMethodInBar();
public void someMethodInBar2();
public void someMethodInBar3();
}
...
private final IinterfaceBarWrapper bar;
public BarWrapper(IinterfaceBarWrapper bar)
{
this.bar = bar;
}