Pracuję nad projektem, w którym usługi muszą zostać dodane do komponentu. Klasa Service
jest interfejsem bez żadnych metod. Oto przykład działania moich usług:Generics wildcarding z "extends" i "super"
public interface Service { }
public interface CarWash extends Service {
void washCar(Car car);
}
public interface CarRepair extends Service {
void repairCar(Car car);
}
Obecnie istnieje wiele wdrożeń tych usług. Jedna klasa może realizować wiele usług, jak do tej klasy garaż:
public class Garage implements CarWash, CarRepair {
@Override
public void washCar(Car car) { /* .. */ }
@Override
public void repairCar(Car car) { /* .. */ }
}
Po dodaniu usługi do komponentu, nie chcą muszą korzystać z usługi do wszystkich zadań, ale na przykład użyć Garage
tylko dla mycie samochodów (CarWash
), ale nie do ich naprawy (CarRepair
). Dlatego określenie zadań jak klas, podobnie jak to:
void addService(Service service, Class<? extends Service> task);
Aby sprawdzić, czy usługa może rzeczywiście wykonać zadanie, użyłem rodzajowych:
<T extends Service> addService(T service, Class<? super T> task);
to działa dobrze, ale nie sprawdza, czy pod warunkiem zadaniem jest rzeczywiście zadanie (klasa, która implementuje Service
), więc to będzie działać:
addService(myTask, Object.class);
szukam sposobu na SPEC IFY że service
musi wdrożyć (przedłużenia) task
ORAZ task
rozszerza interfejs Service
, takiego (nie kompiluje):
<T extends Service> addService(T service, Class<? super T extends Service> task);
Co powiedzie się na to: ' void addService (usługa S, klasa clazz);'? –