gpt4 book ai didi

java - 通用 for-each 循环的困难

转载 作者:行者123 更新时间:2023-11-30 03:27:25 26 4
gpt4 key购买 nike

我在编译 foreach 循环时遇到问题。我很确定这是我的泛型处理的问题,因为该错误是对象兼容性问题。我已搜索解决方案,但找不到任何可以解决该问题的内容。

这是定义 Iterable adjList 的代码。

public class Graph<V,E> { 
private SinglyLinkedList<Vertex<V>> vertices = new SinglyLinkedList<>();
protected class Vertex<V> {
private SinglyLinkedList<Edge<E>> adjList = new SinglyLinkedList<>();
public void addEdge(Edge<E> e) {adjList.addLast(e);}
public Iterable<Edge<E>> adjList() {
return (SinglyLinkedList<Edge<E>>) adjList;
}
}
public Iterable<Edge<E>> edges(Vertex<V> v) {
return v.adjList;
//... Edge<E> is also a nested class
public Iterable<Vertex<V>> vertices() {return vertices;}
}

adjList 实际上是可迭代的,因为 SinglyLinkedList 是:

public class SinglyLinkedList<T> implements Iterable<T> {
//...
private class ListIterator implements Iterator<T> {
// ... next(), hasNext()
}
public Iterator<T> iterator() {return new ListIterator();}
}

这个迭代器在其他情况下工作正常,包括其他 foreach 循环。这是它不起作用的地方(来自不同类的主方法):

Graph<String, Integer> testgraph = createGraph("testgraph.txt");
//createGraph add some vertices and edges to testgraph
for (Vertex v : testgraph.vertices()) {
for (Edge e : testgraph.edges(v)) { //<--- problem here
System.out.print(e.getElement());
}
}
}

错误是“类型不兼容:对象无法转换为 Graph.Edge”。

问题:为什么 testgraph.edges(v) 返回对象列表而不是边?我真的很茫然。

另外,

for (Edge e : v.adjList()) 

也不起作用,有同样的错误,并且在 Edge 之后的菱形括号中添加“Integer”也无法编译。这确实有效,但我真的想避免这种可怕的转换:

for (Edge e : ((Graph<String,Integer>.Vertex<String>)v).adjList())    

非常感谢您的任何想法。

最佳答案

您正在使用VertexEdge无需任何参数化,使它们有效Vertex<Object>Edge<Object> .

public Iterable<Edge<E>> edges(Vertex<V> v) {
return v.adjList;
}

两者EdgeVertex期望有一个 Type指定。

for (Edge<Integer> e : ((Graph<String,Integer>.Vertex<String>)v).adjList())  

以上不是可怕的强制转换,它们是泛型所期望的类型。

您有两个选择:

要么在任何地方指定类型,要么不在任何地方指定它们,完全删除它们。

关于java - 通用 for-each 循环的困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29855522/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com