为什么 io.cucumber.datatable.DataTable asMaps(String.class, String.class).get(0) returns Map<Object,Object> 而不是 Map<String,String>

Why io.cucumber.datatable.DataTable asMaps(String.class, String.class).get(0) returns Map<Object,Object> and not Map<String,String>

如果我解析 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")));

See an error shown by 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.class,String.class)如果不考虑?

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

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

由于参数类型未参数化,编译器无法从您的调用中推断出 KV

我还发现 this javadoc 这让我感到困惑,因为那里的签名 起作用:

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

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

然而,两者都有一个特定的字符串版本:asMaps() 没有任何参数应该总是 return 一个 List<Map<String, String>> 所以至少应该涵盖你的情况。