【问题标题】:Map[] myArr, each with <K>Integer, <V>HashSet ... can't get to HashSet (Java)Map[] myArr,每个都有 <K>Integer, <V>HashSet ... 无法访问 HashSet (Java)
【发布时间】:2011-02-20 18:30:07
【问题描述】:

我无法向下导航到我的数据结构中的 HashSets

我声明了一个 Map[] 数组并用 HashMap 填充了它,其中 K 为 Integer,V 为 String 的 HashSet,但无法将项目添加到 HashSet。

为了说明,我已经把代码删减了......

private Map[] myMaps = null;

myMaps = new Map[numRepeats];
myMaps[0] = new HashMap<Integer,HashSet<String>>();
myMaps[0].put(0, new HashSet<String>());

NetBeans 中的弹出窗口显示我可以使用 java.util.Map 访问

myMaps[0].

但我认为使用 map.get(0) 方法会返回 HashSet

myMaps[0].get(0).

表明我必须使用通用 java.lang.object,而不是 HashSet。由于接下来我需要使用 HashSet.add() 方法,这意味着我被卡住了。我将不胜感激。

谢谢

【问题讨论】:

  • 您有一组地图集吗?你需要一些类,否则你会在调试时扯掉头发!

标签: java map hashmap hashset


【解决方案1】:

您需要将其转换为HashMap&lt;Integer,HashSet&lt;String&gt;&gt;

【讨论】:

  • 谢谢,与 Dante617 达成共识,这是 fwd 的方式
【解决方案2】:

当你定义你的地图时,你可以用所涉及的全部类型来定义它,所以:

private Map<Integer, HashSet<String>>[] myMaps = null;

然后,您不必将其转换回来(假设您在 myMaps 中的所有地图都属于该类型)。

【讨论】:

    【解决方案3】:

    不幸的是,Java 泛型使得拥有泛型类的数组变得相当棘手。但是,这是可能的,它会以类型安全的方式解决您的问题。

    第一。像这样声明你的地图

    private Map<Integer,Set<String>>[] myMaps = null;
    

    第二。使用效用函数分配

    @SuppressWarnings("unchecked")
    public static <T> T[] newMapArray( int size )
    {
        return (T[])java.lang.reflect.Array.newInstance(Map.class, size);
    }
    

    第三。像这样分配 myMaps

    myMaps = newMapArray(numRepeats);
    

    【讨论】:

    • 谢谢。嗯,这对我来说还处于 Java 的早期阶段,看起来很充实。我会研究它并阅读建议。与此同时,我正在使用 Map>[] myMaps = null; (因为我明白)。谢谢
    • @bobox 我当然可以理解为什么这看起来很吓人。它的好处是你可以把它放在一些实用程序类中,并在你喜欢的任何地方重用它。此外,它隐藏了未经检查的演员表。
    猜你喜欢
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 2014-12-30
    • 2014-06-02
    相关资源
    最近更新 更多