Java Genericsタイプの安全性警告回帰ハッシュマップ
-
20-09-2019 - |
質問
私はハッシュマップの再帰ツリー、特にオブジェクトが別のハッシュマップなどへの参照であるハッシュマップマップを使用しています。これは、再帰アルゴリズムの周りに渡されます。
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
代わりにその2番目の議論として。ただの提案。
他のヒント
Hashmapの代わりにこのクラスを使用できます。
public class RecursiveHashMap extends HashMap<String,RecursiveHashMap>
{
}
データ構造は、ファイルのツリー(ファイル)を表現したいように見えます。ノードタイプとしてHashMapでこれを行うことはお勧めしません。
複合パターン(Wikipediaを参照)、簡略化されたコードを使用することをお勧めします。
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();
}
}
使用していたハッシュマップは、DirectoryNodeに表示されるセットに沸騰します。