5

私はハッシュマップの再帰ツリー、特にオブジェクトが別のハッシュマップへの参照であるハッシュマップマップなどを使用しています。これは、再帰アルゴリズムを介して渡されます。

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さん、コメントありがとうございます。

4

3 に答える 3

5

これは、再帰型変数を持つジェネリック メソッドを使用して可能です。次のことを試してください。

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());
    }
}

警告なしで正常にコンパイルされるはずです。

ただし、マップを制御でき、独自のクラスを置き換えることができる場合は、代わりにマップを含むクラス Node (これはツリーのように見えます) を作成する方が読みやすい場合があります。何かのようなもの:

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

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

代わりに、2 番目の引数としてfooaを使用します。Nodeただの提案です。

于 2010-03-14T21:45:24.767 に答える
5

HashMap の代わりにこのクラスを使用できます。

public class RecursiveHashMap extends HashMap<String,RecursiveHashMap>
{
}
于 2010-03-14T21:35:05.863 に答える
1

データ構造は、ファイル (ファイル名) のツリーを表現したいようです。ノードタイプとして 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 に表示される Set に要約されます。

于 2010-03-14T22:04:09.427 に答える