# JdbcBinder.java

    package org.codefilarete.stalactite.sql.statement.binder;

    /**
     * Parent type for {@link ResultSetReader} and {@link PreparedStatementWriter}.
     * Created for technical reasons : both classes should have {@link #getColumnType()} independently to fulfill some
     * features, but while mixing them in {@link ParameterBinder}, the method of both branches is in conflict because of
     * being a "default" implementation in them. Hence, having an upper-common class solves this, this class is the solution.
     *
     * @param <I> type targeted by the binder
     * @author Guillaume Mary
     */
    public interface JdbcBinder<I> {

    	/**
    	 * Gives the type of the parameter in {@link java.sql.ResultSet} or {@link java.sql.PreparedStatement} this class targets
    	 * @return never null
    	 */
    	Class<I> getType();

    	/**
    	 * Gives the type of column this class targets, which is {@link #getType()} by default. But which is no more it when
    	 * wrapping binders for type conversion to deal with column that doesn't match Java type (String <-> Date,
    	 * Number <-> String, etc.).
    	 * Must be implemented in such case to make database schema aligned with binder and avoid exception at configuration
    	 * time if the existing column doesn't match this binder type.
    	 *
    	 *
    	 * @return #getType
    	 */
    	default <O> Class<O> getColumnType() {
    		return (Class<O>) getType();
    	}
    }