Ich arbeite an einem Projekt, bei dem Dienste zu einer Komponente hinzugefügt werden müssen. Die Service
Klasse ist eine Schnittstelle ohne Methoden. Hier ist ein Beispiel, wie meine Dienste funktionieren:Generics-Platzhalter mit "extends" und "super"
public interface Service { }
public interface CarWash extends Service {
void washCar(Car car);
}
public interface CarRepair extends Service {
void repairCar(Car car);
}
Jetzt gibt es viele Implementierungen dieser Dienste. Eine einzelne Klasse kann mehrere Dienste, wie diese Garage Klasse implementieren:
public class Garage implements CarWash, CarRepair {
@Override
public void washCar(Car car) { /* .. */ }
@Override
public void repairCar(Car car) { /* .. */ }
}
Wenn ein Dienst für eine Komponente hinzufügen, ich will nicht den Service für alle Aufgaben zu verwenden, um brauchen, aber beispielsweise verwenden, um die Garage
nur für Autos waschen (CarWash
), aber nicht zur Reparatur (CarRepair
). Deshalb habe ich die Aufgaben als Klassen angeben, wie folgt aus:
void addService(Service service, Class<? extends Service> task);
Um zu überprüfen, ob der Dienst tatsächlich die Aufgabe durchführen konnte, habe ich Generika:
<T extends Service> addService(T service, Class<? super T> task);
Das funktioniert gut, aber nicht überprüft, ob die vorausgesetzte Aufgabe ist eigentlich eine Aufgabe (eine Klasse, die Service
implementiert), so dass dies funktionieren würde:
addService(myTask, Object.class);
ich nach einem Weg suchen, um spec ify dass service
Bedürfnisse zu implementieren (verlängern) die task
und die task
erweitert die Service
Schnittstelle, wie diese (nicht kompiliert):
<T extends Service> addService(T service, Class<? super T extends Service> task);
Wie wäre es mit: ' void addService (S-Service, Klasse clazz);'? –