{"record":{"id":"2cd2968510ae9c2f","repo":"xai-org/x-algorithm","slug":"class-s-is-not-assignable-from-s-for-field-s","errorCode":null,"errorMessage":"Class %s is not assignable from %s for field %s","messagePattern":"Class (.+?) is not assignable from (.+?) for field (.+?)","errorType":"exception","errorClass":"ClassCastException","httpStatus":null,"severity":"error","filePath":"botmaker/src/java/com/twitter/botmaker/compiler/types/ThriftType.java","lineNumber":413,"sourceCode":"        return extractMapFieldValue(mapMetaData, (Map<?, ?>) fieldValue, fieldName);\n\n      case TType.STRUCT:\n        TBaseStructMetaData structMetaData = (TBaseStructMetaData) valueMetaData;\n        if (structMetaData.structClass.isAssignableFrom(fieldValue.getClass())) {\n          return fieldValue;\n        }\n\n        checkIfAssignable(Map.class, fieldValue.getClass(), fieldName);\n        return extractStructFieldValue(structMetaData, (Map<Object, Object>) fieldValue);\n\n      default:\n        throw new ClassCastException();\n    }\n  }\n\n  private void checkIfAssignable(Class ca, Class cb, String fieldName) {\n    if (!ca.isAssignableFrom(cb)) {\n      throw new ClassCastException(\n          String.format(\"Class %s is not assignable from %s for field %s\", ca, cb, fieldName)\n      );\n    }\n  }\n\n  private List<Object> extractListFieldValue(\n      ListMetaData listMetaData, List<?> fieldValue, String fieldName) throws Exception {\n    FieldValueMetaData elemMetaData = listMetaData.elemMetaData;\n\n    ImmutableList.Builder<Object> builder = ImmutableList.builder();\n    for (Object val : fieldValue) {\n      Object converted = extractFieldValue(elemMetaData, val, fieldName);\n      builder.add(converted);\n    }\n    return builder.build();\n  }\n\n  private Set<Object> extractSetFieldValue(","sourceCodeStart":395,"sourceCodeEnd":431,"githubUrl":"https://github.com/xai-org/x-algorithm/blob/24c60942c5c5fdad3a6addffb4c6e6d2f228f04f/botmaker/src/java/com/twitter/botmaker/compiler/types/ThriftType.java#L395-L431","documentation":"checkIfAssignable verifies the runtime class of a value being extracted for a thrift field. If the value's class is not assignable to the field's expected class, a ClassCastException with this message is thrown.","triggerScenarios":"extractFieldValue (via setFieldValue) receiving a value whose Java type doesn't match the field's thrift Java type — e.g. passing a Long for an i32 (Integer) field, or a String where an enum class is expected.","commonSituations":"Rules building thrift records from loosely-typed sources (JSON maps, dynamic scripting) where numbers/collections don't map to the exact boxed Java type the thrift field requires.","solutions":["Coerce the value to the exact expected Java type (Integer vs Long, etc.) before setFieldValue","Derive the expected type via getFieldType and convert dynamically","Add unit tests asserting value types per field"],"exampleFix":"// before\nthriftType.setFieldValue(rec, \"count\", 42L); // i32 field expects Integer\n// after\nthriftType.setFieldValue(rec, \"count\", 42); // Integer","handlingStrategy":"validation","validationCode":"Class<?> expected = thriftType.getFieldType(fieldName).getClass(); // derive per metadata\nif (!expected.isAssignableFrom(value.getClass())) convert(value, expected);","typeGuard":null,"tryCatchPattern":"catch ClassCastException containing 'not assignable from'; coerce the value to the field's exact thrift Java type and retry once","preventionTips":["Convert numbers/strings to the exact boxed type per field before setting","Unit-test record construction against generated thrift classes"],"tags":["thrift","type-mismatch","class-cast"],"backgroundTag":"class-cast-exception","analyzedSha":"24c60942c5c5fdad3a6addffb4c6e6d2f228f04f","analyzedAt":"2026-08-28T11:40:14.686Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}