我定义了以下类:
class Operation<S>
class GetReservationOperation extends Operation<Reservation>
现在我想要一个这样的类:
OperationExecutor<T extends Operation<S>> extends AsyncTask<T,Void,S>{
@Override
protected S doInBackground(T... params) {
return null;
}
}
但这不会编译:
OperationExecutor<GetReservationOperation> executor = new ....
为什么 Java 不允许这样做?
一段时间后,我想到了以下解决方案:
OperationExecutor<T extends Operation<S>,S> extends AsyncTask<T,Void,S>{
@Override
protected S doInBackground(T... params) {
return null;
}
}
但这迫使我写下以下内容:
OperationExecutor<GetReservationOperation,Reservation> executor = new ....
这看起来很奇怪。有什么办法让它看起来更漂亮吗?
编辑 这有效
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; } }
这不起作用的原因是因为 S
尚未在任何地方声明,仅在 T
中作为类型参数引用的约束。 Java 需要 S
声明其他对它的引用才有意义,例如 protected S doInBackground
和 AsyncTask<T,Void,S>
.
您可能会考虑的一件事是 OperationExecutor
需要对特定类型的 Operation<S>
通用.例如,您可以这样做:
OperationExecutor<S> extends AsyncTask<Operation<S>, Void, S> {
@Override
protected S doInBackground(Operation<S>... params) {
return null;
}
}
关于Java 泛型——推断嵌套类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16224457/