使用递归 Hashmap 的 Java 泛型类型安全警告

标签 java generics hashmap type-safety recursive-datastructures

我正在使用散列图的递归树,特别是散列图映射,其中对象是对另一个散列图的引用,等等。这将通过递归算法传递:

foo(String filename, Hashmap<String, Object> map)
{
    //some stuff here
    for (Entry<String, Object> entry : map.entrySet()) 
    {
       //type warning that must be suppressed
       foo(entry.getKey(), (HashMap<String, Object>)entry.getValue());
    }
}

我肯定知道Object类型为 Hashmap<String, Object>但我很恼火,我必须使用 @SuppressWarnings("unchecked") 来抑制警告.

我会对执行 assert(/*entry.getValue() is of type HashMap<String, Object>*/) 的解决方案感到满意或者在不是时抛出异常。为了编译类型安全,我走上了泛型路线,如果我抑制警告,那么它就达不到目的了。

感谢您的评论, ksb

最佳答案

这可以通过使用具有递归类型变量的通用方法来实现。尝试以下操作:

public <T extends Map<String, T>> void foo(String filename, T map) {
    //some stuff here
    for (Map.Entry<String, T> entry : map.entrySet())  {
        foo(entry.getKey(), entry.getValue());
    }
}

应该可以正常编译,没有任何警告。

但是,如果您可以控制 map ,并且可以替换您自己的类,那么制作一个类节点(对我来说这看起来像一棵树)可能更具可读性,包含 map 代替。像这样的东西:

public class Node {
    private Map<String, Node> children;

    ...
    // accessor methods to retrieve children ...
}

foo 取一个 Node 作为它的第二个参数。只是一个建议。

关于使用递归 Hashmap 的 Java 泛型类型安全警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2443814/

相关文章:

java - 如何在 Spring Query 中使用 Inner Join 查询转换 Select

java - 单击按钮时出现 NullPointerException

C# - 编写通用方法来处理位操作

.net - Arraylist 到 List<t> 使用 .Net?

java - 如果删除 ListView 中的最后一项,则显示不同的布局

java峰值拟合库

Java:Enum子集元素的Hashmap

java - 尝试在java中返回HashMap值时出现空指针异常

java - 为什么分配 String 值的 Integer 泛型在打印时不会发出错误?

java - 我应该如何将 Map<String, LinkedList<Object>> 数据存储到数据库表中?