@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_cant_convert_table_with_duplicate_keys() {
        DataTable table = parse("",
            "| 1 | 1 | 1 |",
            "| 4 | 5 | 6 |",
            "| 7 | 8 | 9 |");

        CucumberDataTableException exception = assertThrows(
            CucumberDataTableException.class,
            () -> converter.toMaps(table, Integer.class, Integer.class));
        assertThat(exception.getMessage(), is(format("" +
                "Can't convert DataTable to Map<%s, %s>.\n" +
                "Encountered duplicate key 1 with values 4 and 5",
            typeName(Integer.class), typeName(Integer.class))));
    }