有一个采用Object
类型作为参数的函数,我想通过传递Map<String, String>
变量来使用此函数。不幸的是对此有所抱怨。是否可以将Map<String, String>
强制转换为Object
?我认为任何类型的类都可以自动转换为Object,因为Object是一切的超类。
这是代码:
private GeometryWithTags getRouteGeometryWithTags(Route route)
{
Map<String, Map<String, String>> edgesTags = new HashMap<>();
Iterator<Edge> edgeIterator = route.iterator();
while (edgeIterator.hasNext())
{
Edge edge = edgeIterator.next();
edgesTags.put(new Long(edge.getIdentifier()).toString(), edge.getTags());
}
return new GeometryWithTags(route.asPolyLine(), edgesTags);
}
错误:类型不兼容:地图>无法转换为地图 返回新的GeometryWithTags(route.asPolyLine(),edgesTags);
答案 0 :(得分:0)
无法将Map<String, Map<String, String>>
转换为Map<String, Object>
的原因是后者可以做前者不能做的事情。考虑
Map<String, Map<String, String>> myStringMap = new HashMap<>();
Map<String, Object> myObjectMap = myStringMap; // Not allowed, but suppose it were
myObjectMap.put("key", new Integer(10));
// Now myStringMap contains an integer,
// which is decidedly *not* a Map<String, String>
如果允许这样做,那么.put
调用将在运行时失败,因此类型系统不允许这种情况。如果GeometryWithTags
是您所控制的类,并且实际上从未向地图添加任何内容,则应使用PECS pattern
GeometryWithTags(Map<String, ? extends Object> map) { ... }
现在我们有了一个可以具有任何值类型的映射,但是我们保证不能添加任何内容(因为?
可能与所添加的值不兼容)。
如果GeometryWithTags
需要能够修改地图,或者您无法控制该类,那么您实际上需要先创建一个Map<String, Object>
。