如何解决AsyncTask中doInBackground返回自定义类列表的类型不兼容错误
解决AsyncTask返回类型不兼容的问题
你遇到的attempted to use incompatible return type错误,本质是两个地方的类型不匹配导致的,我帮你拆解并修正:
错误原因分析
AsyncTask泛型参数不匹配
AsyncTask的三个泛型参数定义是:AsyncTask<Params, Progress, Result>,其中第三个参数Result必须和doInBackground的返回类型完全一致。你现在把Result设成了String,但doInBackground返回的是List<ReadingModel>,类型直接冲突。ReadingModel内部类List的泛型错误
你定义的ReadingModel.List继承自ArrayList<MobilePostModel>,但你实际需要的是装ReadingModel的列表,这个泛型类型写错了,导致后续返回的列表类型和预期不匹配。
修正步骤
步骤1:修正ReadingModel的内部类
把内部类List的泛型改为ReadingModel,确保它是专门用来装当前模型的列表容器:
public class ReadingModel { @SerializedName("BillID") @Expose private String BillID; @SerializedName("Mablagh") @Expose private String Mablagh; @SerializedName("PayID") @Expose private String PayID; public String getBillID() {return BillID;} public void setBillID(String BillID){this.BillID=BillID;} public String getMablagh(){return Mablagh;} public void setMablagh(String Mablagh){this.Mablagh=Mablagh;} public String getPayID(){return PayID;} public void setPayID(String PayID){this.PayID=PayID;} // 修正泛型类型为ReadingModel public static class List extends ArrayList<ReadingModel> {} }
步骤2:修正AsyncTask的泛型参数
把AsyncTask的第三个泛型参数从String改成List<ReadingModel>,让它和doInBackground的返回类型一致:
private class AsyncRead extends AsyncTask<GetReadingTask, Void, List<ReadingModel>> { ReadingModel.List x; @Override protected List<ReadingModel> doInBackground(GetReadingTask... getReadingTasks) { ir.behineh.wepapiinterface.GETREADINGINTERFACE.GetReading taskService= ServiceGenerator.createService(ir.behineh.wepapiinterface.GETREADINGINTERFACE.GetReading.class); Call<ReadingModel.List> tasks=taskService.getReadings("application/x-www-form-urlencoded","application/json","bearer "); try { x=tasks.execute().body(); } catch (IOException e) { e.printStackTrace(); } return x; } // 可选:推荐用onPostExecute异步处理结果,避免阻塞主线程 @Override protected void onPostExecute(List<ReadingModel> result) { super.onPostExecute(result); // 在这里处理返回的列表,比如更新UI } }
步骤3:修正调用代码(可选优化)
你当前用get()方法会阻塞主线程,容易导致ANR(应用无响应),建议改用onPostExecute处理结果。如果一定要用get(),记得捕获异常:
try { List<ReadingModel> List_result = new AsyncRead().execute(params).get(); // 处理结果 } catch (ExecutionException | InterruptedException e) { e.printStackTrace(); }
内容的提问来源于stack exchange,提问作者behzad
相关产品推荐
相关产品推荐

