2016-07-25 9 views
1

Es ist wahrscheinlich eine einfache Frage, aber ich sehe es nicht.Java-Listener, generische und Vererbung

Ich habe eine Schnittstelle

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

Ich habe eine Super-Klasse und eine Renderbeispielklasse Foo, die Render erstreckt.

Jetzt, beim Erstellen der Klasse Foo gebe ich eine Instanz der Schnittstelle als Listener/Beobachter oder was auch immer.

bisher funktioniert alles und ist so wie es sein soll.

aber jetzt in der Foo-Klasse selbst wenn ich versuche, die Schnittstelle so zu nennen:

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); 
} 
} 

ich diesen Fehler:

error

Nun ist die Frage, die ich habe ist, dass SpriteRenderable , das betreffende Argument erweitert Renderable. Was vermisse ich?

edit: Die Idee dahinter ist, dass ich eine Schnittstelle Implementierung für jede Klasse verwenden kann, die Renderable (und es wird viel).

+1

Bitte Ihren Code Refactoring (warum ein Render einen Verweis auf seine eigenen Hörer halten?) Und den Code für SpriteRenderable zeigen. – Silverclaw

+3

Lesen Sie hierzu: http://StackOverflow.com/Questions/2723397/what-is-pecs-producer-extends-consumer-super –

+0

@Silverclaw Nun, es muss die Referenz halten. wie sonst könnte es die Schnittstelle nennen? Ich bin mir nicht sicher, ob ich verstehe, was du meinst. – Adolf

Antwort

0

Ihre Schnittstelle Arten, die die Update-Methode hat einen Parameter und die Update-Methode in Ihre Foo-Klasse integriert hat keine Parameter.

In Ihrem RenderableListener Schnittstelle ändern Update (T-Element) zu:

public void update(); 

auf diese Weise die Methode in Foo erstellt entspricht den in RenderableListener präsentierten Spezifikationen.

+0

Wenn der Foo # update() aufgerufen wird, wird der Listener aufgerufen. und der Listener hat einen Parameter, der Renderable erweitert. und genau das verstehe ich nicht: warum kann ich 'Foo.this' nicht als Parameter übergeben, wenn es Renderable deutlich erweitert. – Adolf

+1

@Adolf, weil 'listener' in' Foo' nicht unbedingt ein 'RenderableListener ' ist - es könnte ein 'RenderableListener ' sein und der Compiler kann es nicht sagen. –

+0

@DavidWallace Ich sehe was du meinst. Der Compiler müsste in gutem Glauben laufen, dass der Programmierer nicht versagt hat. Ich werde einen anderen Ansatz verwenden, nur nicht so schön wie dieser. Danke für die Antwort. – Adolf

-1

Try this:

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