재발 한 해시 맵으로 Java 제네릭 타입 안전 경고
-
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
대신 두 번째 논쟁으로. 단지 제안입니다.
다른 팁
해시 맵 대신이 클래스를 사용할 수 있습니다.
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에 나타나는 세트로 요약됩니다.
제휴하지 않습니다 StackOverflow