Убедитесь, что объект реализует интерфейс
Я получил класс, который использует 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 ответа
Если вам нужно, чтобы обернутый объект был одновременно подклассом Bar и экземпляром интерфейса Foo, который Bar не реализует, то единственный способ, который я вижу, - это принять подкласс Bar, который реализует Foo:
public abstract FooBar extends Bar implements Foo {
}
Это будет делать то, что вы хотите: пользователь будет вынужден расширить FooBar и, таким образом, предоставить подкласс Bar, который реализует Foo.
Вместо того, чтобы брать объект 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;
}