我使用包含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());
    }
}

我知道肯定是ObjectHashmap<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。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top