确保对象将实现接口

时间:2015-06-21 16:06:07

标签: java interface proxy-classes

我有一个使用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();

2 个答案:

答案 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;
}