2017-05-12 2 views
3

ich eine solche Struktur haben:Java Generika, wie parametrisierte Unterklasse ändern

public class Record{} 
public class ParsedRecord extends Record {} 
public class RecordsList extends ParsedRecord {} 

public abstract class Processor<T extends Record >{ private BlockingQueue<T> queue;} 

public class Dispatcher extends Processor<ParsedRecord> { 

    List<ParsedRecord> list; 

    public Dispatcher() { 
    } 

    public void process(ParsedRecord record){ 
     //blabla 
    } 
    } 

I Dispatcher-Klasse mit Parameter verwenden möchten, die ParsedRecord oder jede Art sind, die von ParsedRecord Klasse erweitert.

Könnte mir bitte helfen, die Dispatcher-Klassendefinition richtig zu ändern?

Antwort

2

könnte so einfach sein wie Ihre Klassendefinition zu ändern:

public class <T extends ParsedRecord> Dispatcher extends AbstractProcessor<T> { 

und dann: Verwenden Sie die T als Typ für die Liste, oder für den Parameter process() gegeben.

Aber die wirkliche Antwort hier ist: Studie die concept. Versuchen Sie nicht, mit Versuch und Irrtum zu gehen.

+0

Ich habe diese Variante schon einmal versucht, bekomme aber Fehler in den Dispatcher-Unterklassen und war mir nicht sicher. Nach Ihrer Antwort habe ich das behoben. Vielen Dank. Ich verspreche, dass ich Generika gründlich lernen werde. – Andrew

2

Sie deklarieren eine Processor Klasse, aber Sie erweitern AbstractProcessor.
Sie haben wahrscheinlich einen Namensfehler in der Frage gemacht.

Also ich nehme an, Sie haben nur eine AbstractProcessor Klasse, um eine konkrete Antwort zu geben.

In Ihrem Fall, wenn Sie die Typdeklaration der Klasse mit dem Parameter des Verfahrens im Zusammenhang wollen, müssen Sie die Methode in der übergeordneten Klasse deklarieren zuerst und geben Sie den Parameter mit dem deklarierten Typ:

public abstract void process(T record){ 

würden Sie eine übergeordnete Klasse haben:

public abstract class AbstractProcessor<T extends Record >{ 
    ... 
    public abstract void process(T record); 
    ... 
} 

Und in der Unterklasse Sie diese symmetrische Erklärung erhalten:

public class Dispatcher extends AbstractProcessor<ParsedRecord> {  
    ... 

    public void process(ParsedRecord record){ 
     //blabla 
    } 
} 
+0

Ich habe die ursprünglichen Namen für Klassen geändert. Und vergaß eine – Andrew

+1

Du hast meine Stimme hier; als Sie sich die Zeit genommen haben, nach den Unstimmigkeiten in der Frage zu fragen; was dazu beigetragen hat, das Ding am Ende zu verbessern! – GhostCat

+0

Wie in der Regel bist du fair :) – davidxxx