Убедитесь, что объект реализует интерфейс

Я получил класс, который использует 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;
}
Другие вопросы по тегам