我对抽象类有疑问。
我正在开发一个Android应用程序并编写了一个抽象类,它扩展了AsyncTask< Void,Fragment,Fragment>类。 doInBackground方法已经在我的抽象类中有一个主体,但我不想在这里返回任何内容。现在我扩展该抽象类的子类应该再次覆盖doInBackground方法,调用super,做一些工作然后返回一个值。
我的抽象类中的方法如下所示:
@Override
protected Fragment doInBackground(Void... params) {
//do some work without returning a value
}
我的扩展子类中的方法如下所示:
@Override
protected Fragment doInBackground(Void.. params) {
super.doInBackground();
MyFragment fragment = new MyFragment();
//do some work with the fragment
return fragment;
}
因此,如果我的抽象类中没有return语句,Android Studio会使用“Missing return statement”错误标记我的方法。有没有办法避免这个错误消息,因为我的子类有一个返回值,所以应该没问题,是吗?
答案 0 :(得分:1)
注意:这是一般答案,忽略了问题中显示的具体情况,可能有意义也可能没有意义(见comment)。
如果该方法应该返回一个值,但是超类中的实现不能返回一个值,那么它就不是该方法的实现。
如果您仍然需要超类中的一些公共代码,请在单独的方法中编写该代码。
abstract class Super {
public abstract MyObj method();
protected final void commonLogic() {
// common logic here
}
}
class Sub extends Super {
@Override
public MyObj method() {
commonLogic();
// code here
return /*something*/;
}
}
如果要强制执行公共逻辑,请使用template method pattern。
abstract class Super {
public final MyObj method() {
// common logic here
return afterCommonLogic();
}
protected abstract MyObj afterCommonLogic();
}
class Sub extends Super {
@Override
protected MyObj afterCommonLogic() {
// code here
return /*something*/;
}
}
答案 1 :(得分:0)
参考Ajay P. Prajapati的回答 - 我认为这并没有正确地解决他的要求。 AsyncTask在一轮中使用Java对象Void
以便在Java语言中同化void
- 注意大写和小写的差异V.我的建议是更改为{{1}在您的抽象类中,您可以AsyncTask<Void, Object, Object>
,在您的子类中,您可以return new Void()
。