{"record":{"id":"813413e2a2ce42b2","repo":"bumptech/glide","slug":"glidetype-methods-must-take-a-requestbuilder-obje-813413","errorCode":null,"errorMessage":"@GlideType methods must take a RequestBuilder object as their first and only parameter, but given: {} for: {}","messagePattern":"@GlideType methods must take a RequestBuilder object as their first and only parameter, but given: (.+?) for: (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"annotation/compiler/src/main/java/com/bumptech/glide/annotation/compiler/GlideExtensionValidator.java","lineNumber":304,"sourceCode":"    TypeMirror toCompare = types.erasure(typeMirror);\n    return Objects.equals(\n        types.asElement(toCompare), elements.getTypeElement(\"com.bumptech.glide.RequestBuilder\"));\n  }\n\n  private void validateGlideTypeParameters(ExecutableElement executableElement) {\n    if (executableElement.getParameters().size() != 1) {\n      throw new IllegalArgumentException(\n          \"@GlideType methods must take a\"\n              + \" RequestBuilder object as their first and only parameter, but given multiple for: \"\n              + getQualifiedMethodName(executableElement));\n    }\n\n    VariableElement first = executableElement.getParameters().get(0);\n    TypeMirror argumentType = first.asType();\n    if (useLegacyTypeComparison\n        ? !argumentType.toString().startsWith(\"com.bumptech.glide.RequestBuilder\")\n        : !isRequestBuilder(argumentType)) {\n      throw new IllegalArgumentException(\n          \"@GlideType methods must take a\"\n              + \" RequestBuilder object as their first and only parameter, but given: \"\n              + argumentType\n              + \" for: \"\n              + getQualifiedMethodName(executableElement));\n    }\n  }\n\n  private void validateGlideTypeAnnotations(ExecutableElement executableElement) {\n    validateAnnotatedNonNull(executableElement);\n  }\n\n  private void validateAnnotatedNonNull(ExecutableElement executableElement) {\n    Set<String> annotationNames =\n        FluentIterable.from(executableElement.getAnnotationMirrors())\n            .transform(\n                new Function<AnnotationMirror, String>() {\n                  @Override","sourceCodeStart":286,"sourceCodeEnd":322,"githubUrl":"https://github.com/bumptech/glide/blob/eb14a895d8f866e6a08c3e19d50ea3bd2c12c20a/annotation/compiler/src/main/java/com/bumptech/glide/annotation/compiler/GlideExtensionValidator.java#L286-L322","documentation":"The single parameter of a @GlideType method must be a RequestBuilder (matching the annotation's `value()` type). validateGlideTypeParameters reads the first parameter's type and throws when it is not a RequestBuilder — legacy path compares by `toString().startsWith(\"com.bumptech.glide.RequestBuilder\")`, modern path uses erased-element equality against com.bumptech.glide.RequestBuilder.","triggerScenarios":"GlideExtensionValidator.validateGlideTypeParameters: after the size==1 check, `if (useLegacyTypeComparison ? !argumentType.toString().startsWith(\"com.bumptech.glide.RequestBuilder\") : !isRequestBuilder(argumentType)) throw`. Hit by passing a RequestOptions, Drawable, or any non-RequestBuilder as the sole parameter.","commonSituations":"Confusing @GlideType (operates on RequestBuilder) with @GlideOption (operates on RequestOptions); passing a raw `RequestBuilder` without the generic; using a custom RequestBuilder subclass not recognized due to legacy comparison.","solutions":["Declare the single parameter as `RequestBuilder<T>` where T matches `@GlideType(T.class)`.","If you intended to customize RequestOptions, move the method to be a @GlideOption instead and change the parameter to RequestOptions."],"exampleFix":"// before\n@GlideType(GifDrawable.class)\npublic static RequestBuilder<GifDrawable> asGif(RequestOptions options) {\n  ...\n}\n\n// after\n@GlideType(GifDrawable.class)\npublic static RequestBuilder<GifDrawable> asGif(RequestBuilder<GifDrawable> requestBuilder) {\n  ...\n}","handlingStrategy":"validation","validationCode":"@Test void glideTypeParamIsRequestBuilder() throws Exception {\n  for (java.lang.reflect.Method m : MyGlideExtension.class.getDeclaredMethods()) {\n    if (m.isAnnotationPresent(com.bumptech.glide.annotation.GlideType.class)) {\n      Class<?> first = m.getParameterTypes()[0];\n      assertTrue(\"@GlideType param must be RequestBuilder: \" + m + \" got \" + first,\n          com.bumptech.glide.RequestBuilder.class.isAssignableFrom(first));\n    }\n  }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use RequestBuilder<T> for @GlideType and RequestOptions for @GlideOption — never swap them.","Validate the parameter type in a reflection test."],"tags":["glide","annotation-processing","glidetype","parameters"],"backgroundTag":null,"analyzedSha":"eb14a895d8f866e6a08c3e19d50ea3bd2c12c20a","analyzedAt":"2026-08-14T01:43:54.821Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}