2017-02-28 2 views
1

다음과 같이 GraphNode를 포함하는 클래스 그래프를 정의했습니다. N을 선언하려는 의도는 제네릭을 사용하여 두 GraphNode 객체를 비교하는 것입니다.자바에서 재귀 적으로 정의 된 합성 제네릭 클래스를 인스턴스화

질문은 재귀 적으로 바인딩 된 그래프를 어떻게 인스턴스화해야합니까?

아래와 같이 신고하는 동안 오류가 발생했습니다.

Graph<Integer,Comparable<GraphNode>> graph = new Graph<>();는 는

바운드 불일치

: 유형 Comparable<GraphNode>이 내 위의 문제를 해결 Graph<T,N>

public class Graph<T, N extends Comparable<GraphNode<T, N>>> { 

    private N root; 

    private Class<N> clazz; 

    Graph(Class<N> clazz) { 
     this.clazz = clazz; 
    } 

    public N getInstance() { 
     try { 
      return clazz.newInstance(); 
     } catch (InstantiationException e) { 
      e.printStackTrace(); 
      return null; 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

    @SuppressWarnings("unchecked") 
    public void insert(T d, N n) { 
     if (root == null && n == null) 
      root = getInstance(); 
     if (root == null) 
      root = n; 
     N node = root; 
     while (node != null) { 
      if (node.equals(n)) { 
       N newNode = getInstance(); 
       ((GraphNode<T, N>) newNode).setAdjNode(newNode); 
      } 
     } 
    } 

} 

public class GraphNode<T, N extends Comparable<GraphNode<T, N>>> implements Comparable<N> { 

    private T data; 

    private LinkedHashSet<N> adjNodes = new LinkedHashSet<>(); 

    GraphNode() { 
     data = null; 
    } 

    GraphNode(T d) { 
     setData(d); 
    } 

    public void setAdjNode(N n) { 
     adjNodes.add(n); 
    } 

    public T getData() { 
     return data; 
    } 

    public void setData(T data) { 
     this.data = data; 
    } 

    @Override 
    public int hashCode() { 
     return data.hashCode(); 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (obj instanceof GraphNode<?, ?>) { 
      return ((GraphNode<?, ?>) obj).getData() == this.getData(); 
     } 
     return false; 
    } 

    @Override 
    public String toString() { 
     return data + ""; 
    } 

    @Override 
    public int compareTo(N o) { 
     return this.compareTo(o); 
    } 

} 
+0

은 무엇입니까 완전한 오류 메시지? –

+0

@JimGarrison이 질문을 업데이트했습니다. – Curious

답변

0

유형의 경계 매개 변수 <N extends Comparable<GraphNode<T,N>>>에 대한 유효한 대체 할 수 없습니다

public class Graph<T extends Comparable<T>> { 

    private GraphNode<T> root; 

    public void insert(T d, GraphNode<T> n) { 
     if (root == null && n == null) 
      root = new GraphNode<T>(d); 
     if (root == null) 
      root = n; 
     GraphNode<T> node = root; 
     Queue<GraphNode<T>> queue = new ConcurrentLinkedQueue<>(); 
     queue.add(root); 
     while (!queue.isEmpty()) { 
      node = queue.poll(); 
      node.setNodeColor(color.BLACK); 
      if (node.equals(n)) { 
       GraphNode<T> newNode = new GraphNode<T>(d); 
       ((GraphNode<T>) newNode).setAdjNode(newNode); 
      } else { 
       queue.addAll(node.getUnexploredAdjNodes()); 
      } 
     } 
    } 

} 
public class GraphNode<T extends Comparable<T>> implements Comparable<GraphNode<T>> { 

    enum color { 
     WHITE, GREY, BLACK 
    }; 

    private T data; 

    private color nodeColor = color.WHITE; 

    private LinkedHashSet<GraphNode<T>> adjNodes = new LinkedHashSet<>(); 

    GraphNode() { 
     data = null; 
    } 

    GraphNode(T d) { 
     setData(d); 
    } 

    public void setAdjNode(GraphNode<T> n) { 
     adjNodes.add(n); 
    } 

    public T getData() { 
     return data; 
    } 

    public void setData(T data) { 
     this.data = data; 
    } 

    public LinkedHashSet<GraphNode<T>> getAdjNodes() { 
     return adjNodes; 
    } 

    public LinkedHashSet<GraphNode<T>> getUnexploredAdjNodes() { 
     LinkedHashSet<GraphNode<T>> n = new LinkedHashSet<>(); 
     for (GraphNode<T> node : adjNodes) { 
      if (node.getNodeColor() == color.WHITE) 
       n.add(node); 
     } 
     return n; 
    } 

    public color getNodeColor() { 
     return nodeColor; 
    } 

    public void setNodeColor(color nodeColor) { 
     this.nodeColor = nodeColor; 
    } 

    @Override 
    public int hashCode() { 
     return data.hashCode(); 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (obj instanceof GraphNode<?>) { 
      return ((GraphNode<?>) obj).getData() == this.getData(); 
     } 
     return false; 
    } 

    @Override 
    public int compareTo(GraphNode<T> o) { 
     return data.compareTo(o.data); 
    } 

    @Override 
    public String toString() { 
     return data + ""; 
    } 
} 
Graph<Integer> graph = new Graph<>();