LINUX.ORG.RU

История изменений

Исправление r--r--r--, (текущая версия) :

Возьми мой пример на Go и попробуй точно так же реализовать его на Java - получишь отражение проблемы.
нужна реализация двух интерфейсов в одном классе
Перечитай самый первый пример с LinkedList или пример на Go

Ну, хорошо. Возьмём пример на Go.

Вот как выглядит его версия на яве, где впендюрили общий интерфейс, хотя он вроде тут уже опционален:

class BeepBoopImpl <T extends Beep & Boop> implements BeepBoop {
    private T impl;

    public void beep() {
        impl.beep();
    }

    public void boop() {
        impl.boop();
    }

    public BeepBoopImpl(T impl) {
        this.impl = impl;
    }
}

public void main(String[] args) {
    Impl1 impl = new Impl1();
    BeepBoop b1 = new BeepBoopImpl<>(impl);
    foo(b1);

    Impl2 imp2 = new Impl2();
    BeepBoop b2 = new BeepBoopImpl<>(imp2);
    foo(b2);

}

interface BeepBoop extends Beep, Boop {
}

// emulates injection
static void foo(BeepBoop bb) {
    bb.beep();
    bb.boop();
}

// normally in a 3rd party library that doesn't know interface BeepBoop
interface Beep {
    void beep();
}

interface Boop {
    void boop();
}


class Impl1 implements Beep, Boop {
    @Override
    public void beep() {
        System.out.println("Impl1 beep.");
    }

    @Override
    public void boop() {
        System.out.println("Impl1 boop.");
    }
}

class Impl2 implements Beep, Boop {
    @Override
    public void beep() {
        System.out.println("Impl2 beep.");
    }

    @Override
    public void boop() {
        System.out.println("Impl2 boop.");
    }
}

В чём тут проблема с явой?

Исходная версия r--r--r--, :

Перечитай самый первый пример с LinkedList или пример на Go

Ну, хорошо. Возьмём пример на Go.

Вот как выглядит его версия на яве, где впендюрили общий интерфейс, хотя он вроде тут уже опционален:

class BeepBoopImpl <T extends Beep & Boop> implements BeepBoop {
    private T impl;

    public void beep() {
        impl.beep();
    }

    public void boop() {
        impl.boop();
    }

    public BeepBoopImpl(T impl) {
        this.impl = impl;
    }
}

public void main(String[] args) {
    Impl1 impl = new Impl1();
    BeepBoop b1 = new BeepBoopImpl<>(impl);
    foo(b1);

    Impl2 imp2 = new Impl2();
    BeepBoop b2 = new BeepBoopImpl<>(imp2);
    foo(b2);

}

interface BeepBoop extends Beep, Boop {
}

// emulates injection
static void foo(BeepBoop bb) {
    bb.beep();
    bb.boop();
}

// normally in a 3rd party library that doesn't know interface BeepBoop
interface Beep {
    void beep();
}

interface Boop {
    void boop();
}


class Impl1 implements Beep, Boop {
    @Override
    public void beep() {
        System.out.println("Impl1 beep.");
    }

    @Override
    public void boop() {
        System.out.println("Impl1 boop.");
    }
}

class Impl2 implements Beep, Boop {
    @Override
    public void beep() {
        System.out.println("Impl2 beep.");
    }

    @Override
    public void boop() {
        System.out.println("Impl2 boop.");
    }
}

В чём тут проблема с явой?