2009-06-07 26 views
5

ich die folgenden Klassen haben ein:Java Generics, erweitert Generics und abstrakte Klassen

public abstract class Process<T,S> { 
    ... 
} 

public abstract class Resource<T, S extends Process<T, S>> { 
    protected S processer; 
    ... 
} 

public class ProcessImpl<EventType1, EventType2> { 
    ... 
} 

public class ResourceImpl extends Resource<EventType1, ProcessImpl> { 
    processer = new ProcesserImpl(); 
    ... 
} 

Alles ist in Ordnung, bis ich zum ResourceImpl bekommen. Mir wurde gesagt, dass ProcessImpl kein gültiger Ersatz für den beschränkten Parameter <S extends Process<T,S>> des Typs Resource<T,S> ist.

Ich habe verschiedene Möglichkeiten ausprobiert, um dies zu umgehen und weiter an die Wand zu schlagen.

Hat jemand irgendwelche Ideen?

Antwort

11
public class ProcessImpl<EventType1, EventType2> { 
... 
} 

Weil ProcessImpl nicht Prozess verlängern. Ihr ProcessImpl wird nicht von Process abgeleitet, und Sie geben an, dass dieser Parameter deklariert werden soll.

0

Ich kann keinen Weg sehen, um die ursprüngliche Version zu bearbeiten, oder gegebene Antworten ohne eine bessere rep kommentieren.

Dieser Code existiert auf einer Web-Schicht, der Ereignistyp2 ist auf der Persistenzschicht definiert und nur in der Kernschicht verfügbar, die unterhalb dieser Ebene vorhanden ist.

Also leider ohne eine enge Kopplung, die ich vermeiden möchte, habe ich keinen Zugriff auf EventType2.

+0

Ich verstehe nicht. Können Sie ProcessImpl nicht von Process erweitern? –

1

Man könnte so etwas tun:

public abstract class Process<T, S> { 
} 

public abstract class Resource<T, S extends Process<T, S>> { 
    S processor; 

} 

public class ProcessImpl extends Process<EventType1, ProcessImpl> { 
} 

public class ResourceImpl extends Resource<EventType1, ProcessImpl> { 

} 

Wenn Sie den S Parameter des Resource einschränken müssen einen Prozessor Sie auch sein, um es richtig auf die Klasse ProcessImpl erklären. Ich weiß nicht, was EventType2 ist, aber es sollte Prozessschnittstelle implementieren. Ich nahm an, dass Sie eigentlich ProcessImpl sagen möchten.

0

Wenn Sie nicht möchten, dass Ihr Code von einem vorhandenen Paket abhängt, das die Process enthält, könnten Sie auch ein neues Schnittstellenpaket einführen, das von nichts am Ende der Klassenhierarchie abhängig ist. (Wenn Sie in der Lage sind, die Beschränkungen der Vererbung natürlich zu ändern.)