ClassCastException:无法转换为java.lang.Integer

我知道在stackoverflow中已经有很多问题,但我找不到能解决问题的答案。

在下面的代码中,我无法打印出ArrayList每个项目,因为它表示"Edge cannot be cast to java.lang.Integer"

我试图使用for(Integer item :p1)for (int item: p1)打印每个项目for(Integer item :p1)但两者都不起作用。

我想也许问题是因为Edge类中的toString()方法但是如果我不使用toString()我就无法获得真正的密钥号(它将被打印为Edge@28a418fc或类似的东西)

谢谢你以前的帮助

主要课程

 public class Ranker7 { static Graph g; static Node n; static Edge e; static HashMap nodeMap; int id; static double weight; static int year; static int type; Ranker7() { g = new Graph(); nodeMap = new HashMap(); n = new Node(id,year,type,weight); } public static void main (String[] args) throws Exception{ long startTime = System.currentTimeMillis(); /**Rule Mining**/ Ranker7 Ranker = new Ranker7(); Connection connect = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; PreparedStatement preparedStatement2 = null; ResultSet resultSet2 = null; HashMap nodeMap = new HashMap(); System.out.println("Processing..."); Class.forName("com.mysql.jdbc.Driver"); connect = DriverManager.getConnection("jdbc:mysql://localhost/arnetminer?"+"user=root&password=1234"); preparedStatement = connect.prepareStatement("Select fr,t,ty from subedge"); resultSet = preparedStatement.executeQuery(); int i=0; while(resultSet.next()) { g.addEdgeForIndexing(resultSet.getInt(1),resultSet.getInt(2),resultSet.getInt(3)); i++; System.out.println( "edges added to G = "+i); } System.out.println("Loaded " + g.nodeCount() + " nodes."); preparedStatement = connect.prepareStatement("Select node,year,type from subnode2"); resultSet = preparedStatement.executeQuery(); int h=0; while(resultSet.next()) { Node n = new Node(resultSet.getInt(1), resultSet.getInt(2),resultSet.getInt(3),weight); int key1=resultSet.getInt(1); nodeMap.put(key1,n); h++; } System.out.println(nodeMap); System.out.println(nodeMap.size()); Scanner sc = new Scanner(System.in); System.out.println("How many authors do you want to enter?"); int num = sc.nextInt(); int[] authorNames = new int[num]; for(int a = 0; a < authorNames.length; a++){ System.out.println("Enter author name:"); authorNames[a] = sc.nextInt(); } System.out.println("Year : "); int inputYear3 = sc.nextInt(); ArrayList p1 = new ArrayList(); /**Get the papers written by input author AP**/ for(int b=0; b< authorNames.length;b++){ int AuthorID1 = authorNames[b]; p1 = g.getOutEdgesToP(AuthorID1); } for(int item : p1){ //the error of classcastexception is here System.out.println(item); } } } 

边缘类

 public class Edge { int from; int to; int type; private static int counter = 0; public Edge(int from, int to, int type) { this.from = from; this.to = to; this.type = type; // System.out.println("edges added from " + from + " to " + to + " with type "+ type); } public String toString(){ String repr = Integer.toString(to); return repr; } public int getfrom(){ return from; } public int getto(){ return to; } public int getType(){ return type; } public void setfrom(int from){ this.from = from; } public void setto(int to){ this.to = to; } public void setType(int type){ this.type = type; } } 

图类

 import java.lang.reflect.Field; import java.util.*; public class Graph { private HashSet nodeIDs; public HashMap nodeIDsWithTN; public HashMap TNMap; private HashMap<Integer, ArrayList> edges; private HashMap<Integer, ArrayList> reverse; private int numNodes; private int numEdges; private int numReverse; public Graph() { edges = new HashMap<Integer, ArrayList>(); reverse = new HashMap<Integer, ArrayList>(); nodeIDs = new HashSet(); nodeIDsWithTN = new HashMap(); TNMap = new HashMap(); new HashSet(); } public void addEdgeForIndexing(int from, int to, int T) throws IllegalArgumentException, IllegalAccessException { Edge e = new Edge(from,to,T); nodeIDs.add(e.from); nodeIDs.add(e.to); ArrayList tmp = null; if (edges.containsKey(e.from)) tmp = (ArrayList) edges.get(e.from); else { tmp = new ArrayList(); edges.put(e.from,tmp); } tmp.add(e); ArrayList tmp2 = null; if (reverse.containsKey(e.to)) tmp2 = (ArrayList) reverse.get(e.to); else { tmp2 = new ArrayList(); reverse.put(e.to,tmp2); } tmp2.add(e); } public int nodeCount() { if(nodeIDs.size() > 0) return nodeIDs.size(); // else return numNodes; return numEdges; } public int countInEdges(Integer key) { if (!reverse.containsKey(key)) return 0; return ((ArrayList) reverse.get(key)).size(); } public int countOutEdges(Integer key) { if (!edges.containsKey(key)) return 0; return ((ArrayList) edges.get(key)).size(); } /** public ArrayList getInEdgesFromPtoA(String id) { if (!reverse.containsKey(id)) return null; ArrayList a = reverse.get(id); ArrayList result = new ArrayList(); for(int j=0;j<a.size();j++){ if(a.get(j).startsWith("A")){ result.add(a.get(j)); } } return result; } **/ public ArrayList getOutEdges(Integer key) { if (!edges.containsKey(key)) return null; ArrayList value = edges.get(key); return value; } public ArrayList getOutEdgesToP(int id) { if (!edges.containsKey(id)) { return null; } ArrayList a = edges.get(id); System.out.println ("Arraylist a: " + a); //if i print using this its okay. but i cant get each item in this ArrayList like below for(int item : a){ //the error of classcastexception is here System.out.println(item); } return a; } public Iterator nodeIteratorInitial() { return nodeIDs.iterator(); } } 

节点类

 public class Node { int id; double weight; int year; int type; private static int counter = 0; public Node(int id,int year,int type,double weight) { this.id = id; this.year=year; this.weight = weight; this.type = type; } @Override public String toString() { // here you can create your own representation of the object String repr = "id:" + id + ", year:" + year + ", weight:" + weight + ", node type:" + type; return repr; } public double getWeight(){ return weight; } public int getid() { return id; } public int getType() { return type; } public int getYear() { return year; } public void setWeight(double weight){ this.weight=weight; } public void setid(int id){ this.id=id; } public void setType() { this.type=type; } } 

 private HashMapArrayList > edges; // ...later Edge e = new Edge(from,to,T); // ...later else { tmp = new ArrayList(); edges.put(e.from, tmp ); } tmp.add(e); 

最终,这是原始类型不好的典型例子。 你有一个ArrayList ,你将Edge放入其中。

不幸的是,我不知道如何告诉你如何解决它,因为我不明白你想要做什么。

这里的错误就在于此

  public void addEdgeForIndexing(int from, int to, int T) throws IllegalArgumentException, IllegalAccessException { Edge e = new Edge(from,to,T); nodeIDs.add(e.from); nodeIDs.add(e.to); ArrayList tmp = null; if (edges.containsKey(e.from)) tmp = (ArrayList) edges.get(e.from); else { tmp = new ArrayList(); edges.put(e.from,tmp); } tmp.add(e);//adding an edge to tmp 

稍后在代码中,您将ArrayList作为ArrayList从Map中获取,但是包含Edge的ArrayList会尝试更改

 tmp = new ArrayList(); 

 tmp = new ArrayList(); 

在向其添加Edge时,您应该收到编译错误

你声明:

 int from; int to; int type; 

你应该将它们声明为Integer

 Integer from; Integer to; Integer type; 

因为你以后做了:

 this.from = new Integer(from); 

等等

更好的选择是将作业更改为:

 this.from = from; 

这也将解决此错误,因为您将int分配给int 。 您是否有使用new Integer()的目的? 因为如果不是 – 我建议删除它 – 与原始int相比,它更慢(性能方面)。

底线:保持一致,并在整个代码中使用int ,或Integer – 尽管不是真的需要,尽量不要混合使用。

  public ArrayList getOutEdgesToP(int id) { if (!edges.containsKey(id)) { return null; } System.out.println(edges.get(id)); ArrayList a = edges.get(id); System.out.println("Arraylist a: " + a); // if i print using this its // okay. but i cant get each // item in this ArrayList like // below for (Object item : a) { // the error of classcastexception is here System.out.println(item); } return a; } 

这应该工作。 我没有太多时间寻找解释。