首页 > 解决方案 > newSetFromMap 使用布尔值

问题描述

Collections.newSetFromMap方法具有以下签名:

public static <E> Set<E> newSetFromMap​(Map<E,​Boolean> map)

布尔参数对于地图的意义是什么?E如果我只对参数类型感兴趣,是否需要关注?

标签: javacollections

解决方案


工作方式newSetFromMap是它使用提供的 Map,并在其中放置一个虚拟值 on add。所有其他操作都只是对地图的 keySet 进行操作。它碰巧使用 Boolean.TRUE 作为虚拟值(参见源代码),因此需要输入类型Map<E, Boolean>才能使其类型安全。

根据文档,限制性类型还有助于鼓励正确使用:

调用此方法时指定的映射必须为空,并且不应在此方法返回后直接访问。如果地图创建为空,直接传递给此方法,并且不保留对地图的引用,则可以确保这些条件,如下面的代码片段所示:

Set<Object> weakHashSet = Collections.newSetFromMap(
    new WeakHashMap<Object, Boolean>());

如果该方法Map<E, Object>在理论上接受 a ,则很容易传入已经包含非布尔值的现有映射,这是不鼓励的,并且可能导致令人惊讶的行为。

所以不,只要您正确使用文档中指定的方法,就没什么可担心的。


推荐阅读