首页 > 解决方案 > 为什么 io.cucumber.datatable.DataTable asMaps(String.class, String.class).get(0) 返回 Map而不是地图

问题描述

如果我解析io.cucumber.datatable.DataTable我遇到以下问题:
我有dataTable(io.cucumber.datatable.DataTable)作为方法中的参数。

我尝试将其转换为地图列表dataTable.asMaps(String.class, String.class)
即使我为键和值指定类型String.class,映射创建为 Map< Object , Object >。

所以我不能直接使用它,例如在流中:

dataTable.asMaps(String.class, String.class).stream()
                .forEach(row -> Boolean.parseBoolean(row.get("enabled")));

查看 Intellij IDEA 显示的错误

但首先我必须将它存储在变量中:

List<Map<String, String>> rows = dataTable.asMaps(String.class, String.class);
// BTW, this seems to be sufficient: List<Map<String, String>> rows = dataTable.asMaps();
rows.stream().forEach(row -> Boolean.parseBoolean(row.get("enabled")));

如果不考虑这些参数( String.classString.class ),为什么会有这些参数?

标签: javacucumber

解决方案


这些参数用于查找您的数据到所需类型的转换。签名是

public <K, V> List<Map<K, V>> asMaps(Type keyType, Type valueType)

由于参数类型未参数化,编译器无法从您的调用中推断K和推断。V

我还发现这个 javadoc让我感到困惑,因为那里的签名可以工作:

public <K,V> List<Map<K,V>> asMaps(Class<K> keyType,
                                   Class<V> valueType)

这将使编译器将映射键和值类型推断为字符串。我不知道文档指的是哪个版本的黄瓜。

但是,两者都有一个特定的 String 版本:asMaps()没有任何参数应始终返回 aList<Map<String, String>>所以至少应该涵盖您的情况。


推荐阅读