NationalSecurityAgency/ghidra · error · IllegalArgumentException

Given field does not have the given type: {} != {}

Error message

Given field does not have the given type: {} != {}

What it means

Thrown (unchecked IllegalArgumentException) by the AbstractDBFieldCodec constructor when field.getType() != valueType — the reflective field's Java type does not match the codec's declared value type. The codec serialises a specific value type, so the field it operates on must hold exactly that type.

Source

Thrown at Ghidra/Debug/ProposedUtils/src/main/java/ghidra/util/database/DBCachedObjectStoreFactory.java:337

		protected final int column;

		/**
		 * Construct a codec
		 * 
		 * @param valueType
		 * @param objectType
		 * @param fieldType
		 * @param field
		 * @param column
		 */
		public AbstractDBFieldCodec(Class<VT> valueType, Class<OT> objectType, Class<FT> fieldType,
				Field field, int column) {
			if (!field.getDeclaringClass().isAssignableFrom(objectType)) {
				throw new IllegalArgumentException(
					"Given field does not apply to given object type");
			}
			if (field.getType() != valueType) {
				throw new IllegalArgumentException(
					"Given field does not have the given type: " + valueType + " != " + field);
			}
			this.valueType = valueType;
			@SuppressWarnings("unchecked")
			Class<VT> boxedType = (Class<VT>) MethodType.methodType(valueType).wrap().returnType();
			this.boxedType = boxedType;
			this.objectType = objectType;
			this.fieldType = fieldType;
			this.field = field;
			this.column = column;
		}

		@Override
		public void store(OT obj, DBRecord record) {
			try {
				doStore(obj, record);
			}
			catch (IllegalArgumentException | IllegalAccessException e) {

View on GitHub (pinned to d5f144c24d)

Solutions

  1. Make the codec's value type match field.getType() exactly (derive one from the other).
  2. After changing a field's type, update its codec registration to the matching codec class.
  3. When in doubt, resolve the codec by the field's declared type rather than hardcoding a value type.

Example fix

// before
new IntDBFieldCodec<>(OT.class, longField, col); // throws: field is long, codec is int

// after: use the codec matching the field's type
new LongDBFieldCodec<>(OT.class, longField, col);
Defensive patterns

Strategy: validation

Validate before calling

// Ensure the codec value type matches the field's declared type
if (field.getType() != valueType) {
    // mismatch: pick the codec whose value type equals field.getType()
}

Prevention

When it happens

Trigger: Registering a codec (e.g. a Long codec) against a field whose declared Java type differs (e.g. an Integer or String field), or vice versa. The value type parameter and the field's runtime type must agree.

Common situations: Changing a field's Java type (e.g. int -> long) without updating the codec value type; using the wrong codec class for a field; autoboxing confusion (primitive vs boxed) if the codec expects a specific one.

Related errors


AI-assisted analysis of NationalSecurityAgency/ghidra@d5f144c24d (2026-08-14). Data as JSON: /api/errors/5c3a65fcf0043854. Report an issue: GitHub.