I zostały zdefiniowane następujące klasy:Java rodzajowych - wnioskowanie typu zagnieżdżonego
class Operation<S>
class GetReservationOperation extends Operation<Reservation>
Teraz chciałbym mieć klasę tak:
OperationExecutor<T extends Operation<S>> extends AsyncTask<T,Void,S>{
@Override
protected S doInBackground(T... params) {
return null;
}
}
Ale nie będzie to skompilować:
OperationExecutor<GetReservationOperation> executor = new ....
Dlaczego na to nie pozwala Java?
Po pewnym czasie wymyśliłem następujące rozwiązanie:
OperationExecutor<T extends Operation<S>,S> extends AsyncTask<T,Void,S>{
@Override
protected S doInBackground(T... params) {
return null;
}
}
Ale to zmusza mnie do napisania co następuje:
OperationExecutor<GetReservationOperation,Reservation> executor = new ....
który wygląda dziwnie. Czy jest jakiś sposób, aby wyglądać ładniej?
EDIT To działało
OperationExecutor<S> extends AsyncTask<Operation<S>,Void,S>{
@Override
protected S doInBackground(Operation<S>... params) {
return null;
}
}
OperationExecutor<Reservation> executor = new ....
executor.execute(getReservationOperation);
To jest powód, dla którego słowo kluczowe "var" jest tak przydatne w języku C#. Niestety wydaje się, że java tego nie ma. –
Więc co kryje się za '...'? To samo co twoja deklaracja? –
@HighCore Które naprawdę nie jest istotne, więc ... – Zyerah