@SuppressWarnings("unchecked")
	// compile-time guarantee it is the correct type
	//@formatter:off
	public static <ROW_TYPE, COLUMN_TYPE, DATA_SOURCE>
			DynamicTableColumn<ROW_TYPE, COLUMN_TYPE, DATA_SOURCE> adaptColumForModel(
			GDynamicColumnTableModel<ROW_TYPE, COLUMN_TYPE> model,
			AbstractDynamicTableColumn<?, ?, ?> column) {
	//@formatter:on

		@SuppressWarnings("rawtypes")
		Class<? extends GDynamicColumnTableModel> implementationClass = model.getClass();
		List<Class<?>> modelTypeArguments = ReflectionUtilities.getTypeArguments(
			GDynamicColumnTableModel.class, implementationClass);
		Class<ROW_TYPE> tableRowClass = (Class<ROW_TYPE>) modelTypeArguments.get(0);

		List<Class<?>> columnTypeArguments = ReflectionUtilities.getTypeArguments(
			AbstractDynamicTableColumn.class, column.getClass());
		Class<?> columnRowClass = columnTypeArguments.get(0);

		if (tableRowClass == columnRowClass) {
			// the ROW_TYPE value is the same for the model and the column, so the given instance is
			// the right type
			return (DynamicTableColumn<ROW_TYPE, COLUMN_TYPE, DATA_SOURCE>) column;
		}

		Collection<DynamicTableColumn<ROW_TYPE, COLUMN_TYPE, DATA_SOURCE>> columns =
			getTableColumnForTypes(tableRowClass, column);
		if (columns.isEmpty()) {
			throw new IllegalArgumentException(
				"Do not know how to map column to model for types: " + columnRowClass + " and " +
					tableRowClass);
		}

		// not sure what to do when we have many results; just return one
		return columns.iterator().next();
	}
Returns a column object that is usable by the given model.
<p>
Dynamic columns and models work on row types.  This method allows clients to use columns
with row types that differ from the model's row type, as long as a suitable mapper can
be found.  If no mapper can be found, then an IllegalArgumentException is thrown.  Also,
if the given column is of the correct type, then that column is returned.

@param <ROW_TYPE> the <b>model's</b> row type
@param <COLUMN_TYPE> the <b>model's</b> row type
@param model the table model for which a column is needed
@param column the column that you want to use with the given model
@return a column object that is usable by the given model.
@throws IllegalArgumentException if this method cannot figure out how to map the given
        column's row type to the given model's row type.
Ghidra/Framework/Docking/src/main/java/docking/widgets/table/DiscoverableTableUtils.java