{"record":{"id":"526e5f457b72a033","repo":"google/gson","slug":"cannot-override-built-in-adapter-for-type","errorCode":null,"errorMessage":"Cannot override built-in adapter for ${type}","messagePattern":"Cannot override built-in adapter for (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"gson/src/main/java/com/google/gson/GsonBuilder.java","lineNumber":754,"sourceCode":"   *     class or {@link JsonElement} or any of its subclasses\n   * @see #registerTypeHierarchyAdapter(Class, Object)\n   */\n  @CanIgnoreReturnValue\n  public GsonBuilder registerTypeAdapter(Type type, Object typeAdapter) {\n    Objects.requireNonNull(type);\n    Objects.requireNonNull(typeAdapter);\n    if (!(typeAdapter instanceof JsonSerializer<?>\n        || typeAdapter instanceof JsonDeserializer<?>\n        || typeAdapter instanceof InstanceCreator<?>\n        || typeAdapter instanceof TypeAdapter<?>)) {\n      throw new IllegalArgumentException(\n          \"Class \"\n              + typeAdapter.getClass().getName()\n              + \" does not implement any supported type adapter class or interface\");\n    }\n\n    if (hasNonOverridableAdapter(type)) {\n      throw new IllegalArgumentException(\"Cannot override built-in adapter for \" + type);\n    }\n\n    if (typeAdapter instanceof InstanceCreator<?>) {\n      instanceCreators.put(type, (InstanceCreator<?>) typeAdapter);\n    }\n    if (typeAdapter instanceof JsonSerializer<?> || typeAdapter instanceof JsonDeserializer<?>) {\n      TypeToken<?> typeToken = TypeToken.get(type);\n      factories.add(TreeTypeAdapter.newFactoryWithMatchRawType(typeToken, typeAdapter));\n    }\n    if (typeAdapter instanceof TypeAdapter<?>) {\n      @SuppressWarnings({\"unchecked\", \"rawtypes\"})\n      TypeAdapterFactory factory =\n          TypeAdapters.newFactory(TypeToken.get(type), (TypeAdapter) typeAdapter);\n      factories.add(factory);\n    }\n    return this;\n  }\n","sourceCodeStart":736,"sourceCodeEnd":772,"githubUrl":"https://github.com/google/gson/blob/310ac341f2f92a454b229bf21f70d2d18b2b6db7/gson/src/main/java/com/google/gson/GsonBuilder.java#L736-L772","documentation":"Thrown by GsonBuilder.registerTypeAdapter(Type, Object) when attempting to register an adapter for a type whose built-in adapter is non-overridable. Currently hasNonOverridableAdapter returns true for Object.class, so registering a custom adapter for Object.class is rejected with an IllegalArgumentException. This prevents breaking Gson's core Object handling.","triggerScenarios":"Calling registerTypeAdapter(Object.class, adapter); attempting to override Object.class (sometimes done by accident when a Type resolves to Object).","commonSituations":"Generic deserialization where TypeToken.getRawType() resolves to Object; trying to globally intercept all values via Object.class; registering an adapter keyed by a Type variable that erases to Object.","solutions":["Do not register an adapter for Object.class; target the concrete type you need.","If you need to customize broadly, register a TypeAdapterFactory that inspects the type and handles only the ones you care about.","Use registerTypeHierarchyAdapter for a specific base class/interface instead of Object.","Check that the Type you pass is not Object.class (e.g. capture generic type via TypeToken)."],"exampleFix":"// before\nbuilder.registerTypeAdapter(Object.class, myAdapter); // throws\n\n// after\nbuilder.registerTypeHierarchyAdapter(MyBase.class, myAdapter);","handlingStrategy":"validation","validationCode":"// Reject Object.class before registering\nif (type.equals(Object.class)) {\n  throw new IllegalArgumentException(\"Cannot override built-in adapter for Object.class\");\n}\nbuilder.registerTypeAdapter(type, adapter);","typeGuard":null,"tryCatchPattern":"try { builder.registerTypeAdapter(type, adapter); }\ncatch (IllegalArgumentException e) {\n  if (e.getMessage().startsWith(\"Cannot override built-in adapter\")) {\n    // target a concrete type, or use registerTypeHierarchyAdapter / a factory\n  } else throw e;\n}","preventionTips":["Never register an adapter for Object.class.","Use a TypeAdapterFactory that filters by type instead.","For broad behavior, register a hierarchy adapter on a specific base class."],"tags":["gson-builder","type-adapter","builtin-adapter","registration"],"backgroundTag":null,"analyzedSha":"310ac341f2f92a454b229bf21f70d2d18b2b6db7","analyzedAt":"2026-08-10T02:58:47.455Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}