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);
}
}
은 무엇입니까 완전한 오류 메시지? –
@JimGarrison이 질문을 업데이트했습니다. – Curious