class Test { public interface JTableColumn {} public interface JTableEntity extends Comparable {} public class JTableModel, J extends JTable, T extends Enum & JTableColumn> extends AbstractTableModel { @Override public int getRowCount() { return 0; } @Override public int getColumnCount() { return 0; } @Override public Object getValueAt(int rowIndex, int columnIndex) { return null; } void doStuff() { // Do stuff } } interface JTable { AbstractTableModel getModel(); } static class AbstractTableModel { public int getRowCount() { return 0; } public int getColumnCount() { return 0; } public Object getValueAt(int rowIndex, int columnIndex) { return null; } } @SuppressWarnings("unchecked") public static & JTableColumn> void setupTable(JTable table) { ((JTableModel) table.getModel()).doStuff(); } }