use*_*240 7 java generics language-design
我定义了以下类:
class Operation<S>
class GetReservationOperation extends Operation<Reservation>
Run Code Online (Sandbox Code Playgroud)
现在我想要一个这样的课程:
OperationExecutor<T extends Operation<S>> extends AsyncTask<T,Void,S>{
@Override
protected S doInBackground(T... params) {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
但这不会编译:
OperationExecutor<GetReservationOperation> executor = new ....
Run Code Online (Sandbox Code Playgroud)
为什么Java不允许这样做?
过了一段时间我想出了以下解决方案:
OperationExecutor<T extends Operation<S>,S> extends AsyncTask<T,Void,S>{
@Override
protected S doInBackground(T... params) {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
但这迫使我写下以下内容:
OperationExecutor<GetReservationOperation,Reservation> executor = new ....
Run Code Online (Sandbox Code Playgroud)
这看起来很奇怪.有没有办法让它看起来更好?
编辑 这个工作
OperationExecutor<S> extends AsyncTask<Operation<S>,Void,S>{
@Override
protected S doInBackground(Operation<S>... params) {
return null;
}
}
OperationExecutor<Reservation> executor = new ....
executor.execute(getReservationOperation);
Run Code Online (Sandbox Code Playgroud)
现在我想要上这样的课
Run Code Online (Sandbox Code Playgroud)OperationExecutor<T extends Operation<S>> extends AsyncTask<T,Void,S>{ @Override protected S doInBackground(T... params) { return null; } }
这不起作用的原因是因为S尚未在任何地方声明T,仅作为s 边界中的类型参数引用。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;
}
}
Run Code Online (Sandbox Code Playgroud)