Java泛型类型安全递归哈希映射警告
-
20-09-2019 - |
题
我使用包含HashMap的递归树,具体的Hashmap地图,目的是另一个HashMap中的参考等。这将围绕递归算法进行传递:
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());
}
}
应汇编细没有任何警告。
不过,如果你有与对照的图谱,可以代替你自己的类,它可能是更具可读性,使一类节点(这看起来就像一棵树给我),那的包含的一地图代替。是这样的:
public class Node {
private Map<String, Node> children;
...
// accessor methods to retrieve children ...
}
和具有foo
采取Node
作为第二个参数来代替。只是一个建议。
其他提示
可以使用这个类的代替HashMap中:
public class RecursiveHashMap extends HashMap<String,RecursiveHashMap>
{
}
您的数据结构看起来像你想表示它的文件(文件名)的树木。我建议不要用HashMap来做到这一点的节点类型。
我建议使用复合模式(参见维基百科),简化的代码:
abstract class Node
{
String filename;
Node( String filename ) { this.filename = filename; }
abstract foo();
}
class FileNode implements Node
{
FileNode( String filename ) { super(filename); }
foo() { ... }
}
class DirectoryNode implements Node
{
Set<Node> children;
DirectoryNode( String filename, Set<Node> children )
{
super(filename);
this.children = children;
}
foo()
{
for ( Node child : children ) child.foo();
}
}
您使用HashMap的归结为集出现在DirectoryNode。
不隶属于 StackOverflow