{"id":"1f624883a5935be1","repo":"square/retrofit","slug":"response-must-be-parameterized-as-response-foo-or-1f6248","errorCode":null,"errorMessage":"Response must be parameterized as Response<Foo> or Response<? extends Foo>","messagePattern":"Response must be parameterized as Response<Foo> or Response<\\? extends Foo>","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"retrofit-adapters/rxjava2/src/main/java/retrofit2/adapter/rxjava2/RxJava2CallAdapterFactory.java","lineNumber":132,"sourceCode":"    Type responseType;\n    if (!(returnType instanceof ParameterizedType)) {\n      String name =\n          isFlowable ? \"Flowable\" : isSingle ? \"Single\" : isMaybe ? \"Maybe\" : \"Observable\";\n      throw new IllegalStateException(\n          name\n              + \" return type must be parameterized\"\n              + \" as \"\n              + name\n              + \"<Foo> or \"\n              + name\n              + \"<? extends Foo>\");\n    }\n\n    Type observableType = getParameterUpperBound(0, (ParameterizedType) returnType);\n    Class<?> rawObservableType = getRawType(observableType);\n    if (rawObservableType == Response.class) {\n      if (!(observableType instanceof ParameterizedType)) {\n        throw new IllegalStateException(\n            \"Response must be parameterized\" + \" as Response<Foo> or Response<? extends Foo>\");\n      }\n      responseType = getParameterUpperBound(0, (ParameterizedType) observableType);\n    } else if (rawObservableType == Result.class) {\n      if (!(observableType instanceof ParameterizedType)) {\n        throw new IllegalStateException(\n            \"Result must be parameterized\" + \" as Result<Foo> or Result<? extends Foo>\");\n      }\n      responseType = getParameterUpperBound(0, (ParameterizedType) observableType);\n      isResult = true;\n    } else {\n      responseType = observableType;\n      isBody = true;\n    }\n\n    return new RxJava2CallAdapter(\n        responseType, scheduler, isAsync, isResult, isBody, isFlowable, isSingle, isMaybe, false);\n  }","sourceCodeStart":114,"sourceCodeEnd":150,"githubUrl":"https://github.com/square/retrofit/blob/d0b112dad073b7fe49c953ebc46ff1b424cb1e51/retrofit-adapters/rxjava2/src/main/java/retrofit2/adapter/rxjava2/RxJava2CallAdapterFactory.java#L114-L150","documentation":"Thrown by RxJava2CallAdapterFactory when the outer reactive type is parameterized but its argument is raw `Response`. The factory needs `Response<T>` to extract T; raw Response fails the check at RxJava2CallAdapterFactory.java:131. Applies to Observable, Flowable, Single, and Maybe.","triggerScenarios":"A service method returns `Observable<Response>` (or Flowable/Single/Maybe) with raw Response instead of `Observable<Response<User>>`.","commonSituations":"Switching a body return to a Response-wrapped return and dropping the inner generic; autocompleting Response without its argument.","solutions":["Parameterize Response: `Observable<Response<User>> getUser();`.","Or drop the wrapper: `Observable<User> getUser();`.","For unified body+error handling, use `Observable<Result<User>>`."],"exampleFix":"// before\n@GET(\"users/{id}\")\nObservable<Response> getUser(@Path(\"id\") String id);\n\n// after\n@GET(\"users/{id}\")\nObservable<Response<User>> getUser(@Path(\"id\") String id);","handlingStrategy":"validation","validationCode":"for (Method m : MyService.class.getDeclaredMethods()) {\n    Type rt = m.getGenericReturnType();\n    if (rt instanceof ParameterizedType\n            && ((ParameterizedType) rt).getActualTypeArguments()[0] == retrofit2.Response.class) {\n        throw new IllegalStateException(m + \" uses raw Response inside an RxJava2 type.\");\n    }\n}","typeGuard":null,"tryCatchPattern":"try {\n    retrofit.create(MyService.class).getUser(\"1\");\n} catch (IllegalStateException e) {\n    if (e.getMessage().contains(\"Response must be parameterized\")) {\n        throw new IllegalStateException(\"Fix raw Response<> inside RxJava2 return in MyService.\", e);\n    }\n    throw e;\n}","preventionTips":["Always carry the body type into Response<>.","Let the IDE flag raw inner types.","Per-service smoke test in CI."],"tags":["retrofit","rxjava2","java","reflection","response-wrapper"],"analyzedSha":"d0b112dad073b7fe49c953ebc46ff1b424cb1e51","analyzedAt":"2026-08-04T19:12:59.096Z","schemaVersion":2}