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)[…]
。如果您确实使用了栏
中但不在界面
中的任何方法,我建议您将这些方法添加到界面
(可能会将接口扩展到界面栏
)