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