Java 确保对象将实现接口

Java 确保对象将实现接口,java,interface,proxy-classes,Java,Interface,Proxy Classes,我得到了一个使用代理的类。它看起来像这样: public class BarWrapper { private final Bar bar; public BarWrapper(Bar bar) { this.bar = bar; } public int someMethodInBar() { return bar.someMethodInBar(); } public int someMet

我得到了一个使用
代理的类。它看起来像这样:

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();

如果您需要包装的对象既是Bar的子类又是接口Foo的实例,那么Bar没有实现,那么我看到的唯一方法就是接受实现Foo的Bar的子类:

public abstract FooBar extends Bar implements Foo {
}

这将满足您的需要:用户将被迫扩展FooBar,从而提供一个实现Foo的Bar子类。

如果您需要包装的对象既是Bar的子类又是接口Foo的实例,那么Bar不会实现,那么我看到的唯一方法是接受一个实现Foo的Bar子类:

public abstract FooBar extends Bar implements Foo {
}

这将满足您的需要:用户将被迫扩展FooBar,从而提供一个实现Foo的Bar子类。

如果您需要包装的对象既是Bar的子类又是接口Foo的实例,那么Bar不会实现,那么我看到的唯一方法是接受一个实现Foo的Bar子类:

public abstract FooBar extends Bar implements Foo {
}

这将满足您的需要:用户将被迫扩展FooBar,从而提供一个实现Foo的Bar子类。

如果您需要包装的对象既是Bar的子类又是接口Foo的实例,那么Bar不会实现,那么我看到的唯一方法是接受一个实现Foo的Bar子类:

public abstract FooBar extends Bar implements Foo {
}

这将满足您的需要:用户将被迫扩展FooBar,从而提供一个实现Foo的Bar子类。

而不是使用对象
Bar
,只接受该接口

private final Iinterface bar;
public BarWrapper(Iinterface bar)
{
    this.bar = bar;
}
这确实需要代理仅调用接口中的方法。您可能还想调用
条中的方法,但不想调用
界面中的方法。在编译时执行此操作的唯一方法是将这些方法添加到接口中,或者扩展接口:

public interface IinterfaceBarWrapper implements Iinterface
{
    public void someMethodInBar();
    public void someMethodInBar2();
    public void someMethodInBar3();
}


不要使用对象
,只接受接口

private final Iinterface bar;
public BarWrapper(Iinterface bar)
{
    this.bar = bar;
}
这确实需要代理仅调用接口中的方法。您可能还想调用
条中的方法,但不想调用
界面中的方法。在编译时执行此操作的唯一方法是将这些方法添加到接口中,或者扩展接口:

public interface IinterfaceBarWrapper implements Iinterface
{
    public void someMethodInBar();
    public void someMethodInBar2();
    public void someMethodInBar3();
}


不要使用对象
,只接受接口

private final Iinterface bar;
public BarWrapper(Iinterface bar)
{
    this.bar = bar;
}
这确实需要代理仅调用接口中的方法。您可能还想调用
条中的方法,但不想调用
界面中的方法。在编译时执行此操作的唯一方法是将这些方法添加到接口中,或者扩展接口:

public interface IinterfaceBarWrapper implements Iinterface
{
    public void someMethodInBar();
    public void someMethodInBar2();
    public void someMethodInBar3();
}


不要使用对象
,只接受接口

private final Iinterface bar;
public BarWrapper(Iinterface bar)
{
    this.bar = bar;
}
这确实需要代理仅调用接口中的方法。您可能还想调用
条中的方法,但不想调用
界面中的方法。在编译时执行此操作的唯一方法是将这些方法添加到接口中,或者扩展接口:

public interface IinterfaceBarWrapper implements Iinterface
{
    public void someMethodInBar();
    public void someMethodInBar2();
    public void someMethodInBar3();
}


如果(!bar instanceof IIINTERFACE)抛出新的ILLEGARGUMENTEXCEPTION()
?我更愿意找到一种方法在编译时强制执行它,将构造函数更改为
公共BarWrapper(IIINTERFACE bar)[…]
。如果您确实使用了
Bar
中但不在
Iinterface
中的任何方法,我建议您将这些方法添加到
Iinterface
(可能会将接口扩展到
IinterfaceBar
)中。我可以看到的一种方法是使用反射来查看对象是否实现了接口,如果没有实现,则抛出异常。编辑-点击它。@RonThompson请阅读前两条注释。
如果(!bar instanceof Iinterface)抛出新的IllegalArgumentException()
?我更喜欢在编译时找到一种强制它的方法如何将构造函数更改为
公共BarWrapper(Iinterface bar)[…]
。如果您确实使用了
Bar
中但不在
Iinterface
中的任何方法,我建议您将这些方法添加到
Iinterface
(可能会将接口扩展到
IinterfaceBar
)中。我可以看到的一种方法是使用反射来查看对象是否实现了接口,如果没有实现,则抛出异常。编辑-点击它。@RonThompson请阅读前两条注释。
如果(!bar instanceof Iinterface)抛出新的IllegalArgumentException()
?我更喜欢在编译时找到一种强制它的方法如何将构造函数更改为
公共BarWrapper(Iinterface bar)[…]
。如果您确实使用了
Bar
中但不在
Iinterface
中的任何方法,我建议您将这些方法添加到
Iinterface
(可能会将接口扩展到
IinterfaceBar
)中。我可以看到的一种方法是使用反射来查看对象是否实现了接口,如果没有实现,则抛出异常。编辑-点击它。@RonThompson请阅读前两条注释。
如果(!bar instanceof Iinterface)抛出新的IllegalArgumentException()
?我更喜欢在编译时找到一种强制它的方法如何将构造函数更改为
公共BarWrapper(Iinterface bar)[…]
。如果您确实使用了
中但不在
界面
中的任何方法,我建议您将这些方法添加到
界面
(可能会将接口扩展到
界面栏