java - 类型 T 的方法 visit() 未定义 - 为什么?
问题描述
我不明白为什么我得到T 类型的方法 visit() 是未定义的。显然,这里的类型 T 应该是Node。类Node具有 visit() 函数。那么编译器在抱怨什么?此代码应该是一个接受任何数据类型作为其节点的 Graph:
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);
}
}
解决方案
If T
is 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;
。也许这就是你的意图?
推荐阅读
- date - 我想在日期中添加一天并将其另存为新变量
- c++ - 在现有变量上创建类的实例
- .net-core - 将 .NetCore 2.1 应用程序部署到 Web 服务器的步骤。缺少步骤
- python - 如何使 argparse 从 nargs=REMAINDER 拆分 nargs='+'
- google-apps-script - 使用纯获取范围时找不到我的数字表名称范围
- javascript - 有没有办法根据 IFRAME 中的文本字符串制作 IF 语句?
- javascript - 属性和子属性未定义检查
- ssl - 为什么在尝试执行此 cURL 请求时会出现此证书错误?SSL:没有替代证书主题名称与目标主机名匹配
- python - “NoneType”对象在获取谷歌结果时没有属性“文本”
- python - 当有回溯时显示回溯。什么是 EOF 错误