@Override
    @SuppressWarnings("unchecked")
    public <K, V> List<Map<K, V>> toMaps(DataTable dataTable, Type keyType, Type valueType) {
        requireNonNull(dataTable, "dataTable may not be null");
        requireNonNull(keyType, "keyType may not be null");
        requireNonNull(valueType, "valueType may not be null");

        if (dataTable.isEmpty()) {
            return emptyList();
        }

        DataTableType keyConverter = registry.lookupCellTypeByType(keyType);
        DataTableType valueConverter = registry.lookupCellTypeByType(valueType);

        List<String> problems = new ArrayList<>();
        if (keyConverter == null) {
            problems.add(problemNoTableCellTransformer(keyType));
        }
        if (valueConverter == null) {
            problems.add(problemNoTableCellTransformer(valueType));
        }
        if (!problems.isEmpty()) {
            throw mapsNoConverterDefined(keyType, valueType, problems);
        }

        DataTable header = dataTable.rows(0, 1);

        List<Map<K, V>> result = new ArrayList<>();
        List<K> keys = unpack((List<List<K>>) keyConverter.transform(header.cells()));

        DataTable rows = dataTable.rows(1);

        if (rows.isEmpty()) {
            return emptyList();
        }

        List<List<V>> transform = (List<List<V>>) valueConverter.transform(rows.cells());

        for (List<V> values : transform) {
            result.add(createMap(keyType, keys, valueType, values));
        }
        return unmodifiableList(result);
    }
@Test
    void to_maps_of_unknown_key_type__throws_exception__register_table_cell_transformer() {
        DataTable table = parse("",
            "| lat       | lon         |",
            "| 29.993333 | -90.258056  |",
            "| 37.618889 | -122.375    |",
            "| 47.448889 | -122.309444 |",
            "| 40.639722 | -73.778889  |");

        CucumberDataTableException exception = assertThrows(
            CucumberDataTableException.class,
            () -> converter.toMaps(table, String.class, Coordinate.class));
        assertThat(exception.getMessage(), is("" +
                "Can't convert DataTable to List<Map<java.lang.String, io.cucumber.datatable.DataTableTypeRegistryTableConverterTest$Coordinate>>.\n"
                +
                "Please review these problems:\n" +
                "\n" +
                " - There was no table cell transformer registered for io.cucumber.datatable.DataTableTypeRegistryTableConverterTest$Coordinate.\n"
                +
                "   Please consider registering a table cell transformer.\n" +
                "\n" +
                "Note: Usually solving one is enough"));
    }