I have defined following classes:
class Operation<S>
class GetReservationOperation extends Operation<Reservation>
Now I would like to have a class like this:
OperationExecutor<T extends Operation<S>> extends AsyncTask<T,Void,S>{
@Override
protected S doInBackground(T... params) {
return null;
}
}
But this won't compile:
OperationExecutor<GetReservationOperation> executor = new ....
Why doesn't Java allow this?
After some time I came up with the following solution:
OperationExecutor<T extends Operation<S>,S> extends AsyncTask<T,Void,S>{
@Override
protected S doInBackground(T... params) {
return null;
}
}
But this forces me to write the following:
OperationExecutor<GetReservationOperation,Reservation> executor = new ....
Which looks odd. Is there any way to make it look nicer?
EDIT This worked
OperationExecutor<S> extends AsyncTask<Operation<S>,Void,S>{
@Override
protected S doInBackground(Operation<S>... params) {
return null;
}
}
OperationExecutor<Reservation> executor = new ....
executor.execute(getReservationOperation);
Now I would like to have a class like this
OperationExecutor<T extends Operation<S>> extends AsyncTask<T,Void,S>{ @Override protected S doInBackground(T... params) { return null; } }
The reason this doesn't work is because S
hasn't been declared anywhere, only referenced as a type argument in T
's bound. Java needs S
to be declared for other references to it to make sense, for example protected S doInBackground
and AsyncTask<T,Void,S>
.
One thing you might consider is whether OperationExecutor
needs to be generic to a specific type of Operation<S>
. You could do this instead for example:
OperationExecutor<S> extends AsyncTask<Operation<S>, Void, S> {
@Override
protected S doInBackground(Operation<S>... params) {
return null;
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With