문제

나는 재귀적인 해시 맵, 특히 해시 맵 맵을 사용하고 있습니다. 이것은 재귀 알고리즘 주위에 전달됩니다.

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 대신 두 번째 논쟁으로. 단지 제안입니다.

다른 팁

해시 맵 대신이 클래스를 사용할 수 있습니다.

public class RecursiveHashMap extends HashMap<String,RecursiveHashMap>
{
}

귀하의 데이터 구조는 파일의 나무 (파일 이름)를 나타내는 것처럼 보입니다. 해시 맵을 노드 유형으로 사용하는 것이 좋습니다.

복합 패턴 (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에 나타나는 세트로 요약됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top