扩展AsyncTask类的java奇怪行为
我正在使用我自己的通用抽象类(MyAsyncTask),它扩展了AsyncTasks,并且需要一种方法来取消当前运行的所有MyAsyncTasks
abstract class MyAsyncTask<Params, Progress, Result>
extends AsyncTask<Params, Progress, Result> {
...
}
所以我决定在WeakHashMap中存储对所有任务的引用。因为MyAsincTask是一个泛型类,所以我不能简单地将其用作HasMaps键类型。 关于这个HashMap中存储的对象,我必须知道的唯一一件事就是它们有方法
public Boolean cancel(Boolean mayInterruptIfRunning);
在我看来,编写一个接口是合理的
interface Cancelable {
public Boolean cancel(Boolean mayInterruptIfRunning);
}
并让MyAsyncTask实现它:
abstract class MyAsyncTask<Params, Progress, Result>
extends AsyncTask<Params, Progress, Result> implements Cancelable {
private static WeakHashMap<Cancelable, Void> taskList = new WeakHashMap<Cancelable, Void>();
public MyAsyncTask() {
taskList.add(this, null);
}
public static void cancelAll() {
Iterator<Cancelable> iterator = taskList.keySet().iterator();
while (iterator.hasNext()) {
Cancelable task = iterator.next();
if (task != null) {
task.cancel(true);
iterator.remove();
}
}
}
...
}
令人困惑的是,即使AsyncTask有一个最终方法cancel,它的定义与我的接口中的定义完全相同,但我仍然必须在我的类中实现它
public Boolean cancel(Boolean mayInterruptIfRunning) {
return super.cancel(mayInterruptIfRunning);
}
现在我的问题是: 1) 为什么允许我定义这个cancel方法,即使超类中有相同的final方法? 2) 哪一个-如果我执行new MyAsyncTask()之类的操作,将执行原始方法或我的方法。取消()
我尝试用普通java模拟这种情况
abstract interface A {
public Boolean cancel(Boolean a);
}
abstract class B<T> {
public final Boolean cancel(Boolean a) {
System.out.println("B.cacncel called");
return a;
}
}
abstract class C<T> extends B<T> implements A {}
class D extends C<Void> {}
class TestApp {
public static void main(String[] args) {
D x = new D();
x.cancel(true);
}
}
但在这种情况下,我不必在类D中实现cancel方法,因为它已经在类B中实现了。那么,AsyncTask有什么特别之处?为什么我必须重新实现cancel方法
多谢各位
# 1 楼答案
不,
AsyncTask
有boolean cancel(boolean)
,而你有Boolean cancel(Boolean)
这个类编译得很好