我不明白為什么我得到T 型別的方法 visit() 是未定義的。顯然,這里的型別 T 應該是Node。類Node具有visit() 函式。那么編譯器在抱怨什么?這段代碼應該是一個接受任何資料型別作為其節點的圖:
public class Graph<T>{
public Map<T, List<T>> map = new HashMap<>();
public void addEdge(T source, T destination, boolean bidirectional){
if (!map.containsKey(source)){
addVertex(source);
}
if (!map.containsKey(destination)){
addVertex(destination);
}
if (!map.get(source).contains(destination)){
map.get(source).add(destination);
}
if (bidirectional){
if (!map.get(destination).contains(source)){
map.get(destination).add(source);
}
}
}
public void bfs(T node){
Queue<T> q = new LinkedList<>();
node.visit();
System.out.println(node.n);
q.add(node);
int len;
while(!q.isEmpty()){
T n = q.remove();
n.visit();
System.out.println(n.n);
for (T i : map.get(n)){
if (!i.visited){
q.add(i);
}
}
}
}
static class Node{
int n;
boolean visited;
public Node(int n){
this.n = n;
visited = false;
}
public void visit(){
visited = true;
}
public void unvisit(){
visited = false;
}
}
public static void main(String[] args){
Graph<Node> g = new Graph<>();
Node zero = new Node(0);
Node five = new Node(5);
Node four = new Node(4);
g.addEdge(zero, five, false);
g.addEdge(zero, four, false);
g.bfs(zero);
}
}
uj5u.com熱心網友回復:
如果T是 only ever Node,請從中洗掉型別Graph并直接使用Node。
如果T可以是各種類,只有使用這個問題T是T無界-就像T extends Object-但visit()不是對所有物件定義。
解決問題的正確方法是定義一個介面:
interface Visitable {
void visit();
}
讓Node實作它:
class Node implements Visitable {
...
}
給 T 添加一個系結:
public class Graph<T extends Visitable> {
...
}
根據需要重復/組合其他方法。
在這種情況下,通常會輸入Node,它會有一個欄位T value;。也許這就是你的意圖?
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/363423.html
上一篇:<T>T[]toArray(T[]array)不修改原陣列
下一篇:fn的可選泛型型別引數?
