2016-07-25 3 views
1

Это, наверное, простой вопрос, но я его не вижу.Java-прослушиватель, общий и наследование

У меня есть интерфейс

public interface RenderableListener<T extends Renderable>{ 
    public void update(T element); 
} 

У меня есть супер класс визуализируемого и класс Foo примера, который простирающийся визуализируемый.

сейчас, создавая класс Foo, я предоставляю экземпляр интерфейса в качестве слушателя/наблюдателя или что-то еще.

Foo foo = new Foo(new RenderableListener<Foo>(){ 
    public void update(Foo element){} 
}); 

до сих пор все работает и как бы то ни было.

но теперь в самом, когда я пытаюсь вызвать интерфейс, как этот класс Foo:

public class Foo extends Renderable { 
private final RenderableListener<? extends Renderable> listener; 
public Foo(RenderableListener<? extends Renderable> listener){ 
    this.listener = listener; 
} 
public void update(){ 
    listener.update(this); 
} 
} 

я получаю эту ошибку:

error

Теперь вопрос у меня есть, что SpriteRenderable , рассматриваемый аргумент распространяется на Renderable. Что мне не хватает?

Редактировать: идея заключается в том, что я могу использовать одну реализацию интерфейса для каждого класса, расширяющего Renderable (и будет много).

+1

Пожалуйста, рефакторинг кода (почему делает визуализируемых содержать ссылку на свой собственный слушатель?) И показать код SpriteRenderable. – Silverclaw

+3

Прочитайте это: http://stackoverflow.com/questions/2723397/what-is-pecs-producer-extends-consumer-super –

+0

@Silverclaw Ну, он должен держать ссылку. как иначе он мог бы назвать интерфейс? Я не уверен, что понимаю, что вы имеете в виду. – Adolf

ответ

0

Свойства вашего интерфейса, которые имеют метод обновления, и метод обновления, интегрированный в ваш класс Foo, не имеет параметров.

В вашем обновлении изменения интерфейса RenderableListener (T элемент) к:

public void update(); 

Таким образом, метод создан в Foo соответствует спецификациям, представленные в RenderableListener.

+0

, когда вызывается Foo # update(), вызываемый слушателем. и слушатель имеет параметр, который расширяет Renderable. и это именно то, что я не понимаю: почему я не могу передать «Foo.this» в качестве параметра, когда он явно расширяет Renderable. – Adolf

+1

@Adolf, это потому, что 'listener' внутри' Foo' не обязательно является «RenderableListener ' - это может быть «RenderableListener », и компилятор не может сказать. –

+0

@DavidWallace Я понимаю, что вы имеете в виду. Компилятору нужно будет добросовестно работать над тем, что программист не испортил. Я буду использовать другой подход, просто не такой приятный, как этот. Спасибо за ответ. – Adolf

-1

Попробуйте это:

public class Foo extends Renderable { 
    private final RenderableListener<Foo> listener; 
    public Foo(RenderableListener<Foo> listener){ 
     this.listener = listener; 
    } 
    public void update(){ 
     listener.update(this); 
    } 
} 
Смежные вопросы