Как передать экземпляр в класс, который должен реализовать интерфейс, а затем использовать его в Java? - PullRequest
0 голосов
/ 30 марта 2012

Я хочу передать class-insta методу другого и быть уверенным, что он реализует необходимый интерфейс. Код примерно такой

public interface MyInterface{
   someMethod();
}

public class A implements MyInterface{
    B bInst;
    public someMethod(){
        //stuff
    }

    public bar(){
        bInst = new B(this); // [4]
    }
}

public class B{

    private MyInterface x;       //[1]

    // here i don't want to use 
    void B( MyInterface y ){     // [2]
        this.x=y;            // [3]
    }

    private void foo(){
        x.someMethod();
    }

}

Я попытался заменить «MyInterface» в [1] и [2] на «Class <? Extends IBtBytesReciever>», но компилятор выдаст мне ошибки или в [2] или в [3].

Как лучше всего реализовать мою идею?

ПРИМЕЧАНИЕ: я не хочу использовать класс A напрямую, потому что классу B не нужно знать точное имя класса, и он должен быть многократно использован для других классов

РЕДАКТИРОВАТЬ: ошибка включена [4]

 constructor B( class A ) not defined

Ответы [ 2 ]

4 голосов
/ 30 марта 2012

Не совсем понятно, что вы подразумеваете под «здесь я не хочу использовать», но в основном ваш конструктор написан неправильно. Это должно быть просто:

// Or make it non-public if you want, of course.
public B(MyInterface y) {
    this.x = y;
}

Это сделает в точности , что вы хотите: предотвратить передачу всего, что не реализует интерфейс, конструктору. Почему вы хотите сделать его универсальным или вместо него передать ссылку на класс?

Вы можете изменить его на:

public B(Class<? extends MyInterface> clazz) {
    // TODO: catch or declare all the various exceptions this could throw
    this.x = clazz.newInstance();
}

... но это довольно неловко.

РЕДАКТИРОВАТЬ: Просто чтобы прояснить, это абсолютно хорошо , чтобы позвонить new B(this). Короткий, но полный пример, использующий ваш код для начала:

interface MyInterface{
    void someMethod();
}

class A implements MyInterface{
    B bInst;
    public void someMethod(){
    }

    public void bar() {
        bInst = new B(this);
    }
}

class B {
    private MyInterface x;

    B(MyInterface y) {
        this.x=y;
    }

    private void foo(){
        x.someMethod();
    }    
}

Это будет работать абсолютно нормально.

3 голосов
/ 30 марта 2012

Я попытался заменить «MyInterface» в [1] и [2] на «Class <? Extends IBtBytesReciever>»

Это твоя ошибка. Class<? extends IBtBytesReciever> описывает тип объекта класса , который вам может понадобиться для отражения, но он вам здесь не нужен.

Разница между объектом класса и экземпляром класса подобна разнице между статьей в википедии о слонах и одном конкретном слоне. Запись в википедии содержит метаданные о слонах в целом, но если вы хотите выполнить операцию со слоном, в большинстве случаев вам нужен настоящий слон.

В таком методе:

 void foo(MyInterface instance)
 {

 }

Вы можете вызвать foo() с любым допустимым экземпляром класса, который реализует MyInterface.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...