[英]getting java.lang.Object cannot be converted to java.lang.Integer
我正在用Java實現Graph數據結構。 這是我的實現:
package Graph;
import java.util.*;
import java.io.*;
public class Graphs
{
int size;
LinkedList<Integer>[] ll;
Graphs(int size)
{
this.size = size;
ll = new LinkedList[size];
for(int i=0; i<size; i++)
ll[i] = new LinkedList<Integer>();
}
public static void print(LinkedList lli)
{
for(Integer i: lli)
System.out.println(i);
//for(int i=0; i<lli.size(); i++)
// System.out.println(lli.get(i));
}
public static void addEdge(Graphs graph, int up, int to)
{
graph.ll[to].add(up);
}
public static void main(String args[])
{
int V=5;
Graphs graph = new Graphs(V);
addEdge(graph,1,2);
addEdge(graph,1,3);
addEdge(graph,2,3);
addEdge(graph,3,1);
addEdge(graph,3,2);
addEdge(graph,3,4);
addEdge(graph,4,3);
print(graph.ll[3]);
}
}
基本上,我為該圖創建一個LinkedLists數組,並為該圖的頂點創建了每個鏈接列表。
但是,我在行號24處無法將java.lang.Object轉換為java.lang.Integer。對於為什么收到此錯誤一無所知。 關於我缺少什么的任何建議?
聲明這樣的打印方法:
public static void print(LinkedList<Integer> lli)
然后,它將知道lli的內容是整數。
您遇到的特定問題與打印功能有關:
public static void print(LinkedList lli){
for(Integer i: lli)
System.out.println(i);
}
LinkedList
是原始類型,這意味着您丟失了有關列表中存儲哪些對象的類型信息。 通常, 原始類型是個壞主意 。 我很驚訝你的代碼編譯,但我只想說的是說Integer i : lli
你assumming該范圍內的每一個對象lli
是一個Integer
,當參數LinkedList
不提供這樣的保證。
為確保此方法有效, LinkedList lli
更改為LinkedList<Integer> lli
。 這意味着lli中的每個對象都是Integer的實例,因此迭代不會失敗。
當我嘗試運行您的代碼時,IDE會警告我有關該行的信息
ll = new LinkedList[size]
說:
未經檢查的賦值:“ java.util.LinkedList []”到“ java.util.LinkedList <java.lang.Integer> []”
這表明這里有些魚腥味。
混合列表和數組在使用通用類型時會有些混亂-如果您需要大小可變性,則只創建列表列表會容易得多,而且更清潔,如果不需要,則可以創建多維數組。 對於您的情況,這主張使用ArrayList<LinkedList<Integer>>
等。
我們可以通過解決一般性問題來解決這些問題:
import java.util.*;
import java.io.*;
public class Graphs
{
int size;
ArrayList<LinkedList<Integer>> ll;
Graphs(int size)
{
this.size = size;
ll = new ArrayList<LinkedList<Integer>>();
for(int i=0; i<size; i++)
ll.add(new LinkedList<Integer>());
}
public static void print(LinkedList<Integer> lli)
{
for(Integer i: lli)
System.out.println(i);
//for(int i=0; i<lli.size(); i++)
// System.out.println(lli.get(i));
}
public static void addEdge(Graphs graph, int up, int to)
{
graph.ll.get(to).add(up);
}
public static void main(String args[])
{
int V=5;
Graphs graph = new Graphs(V);
addEdge(graph,1,2);
addEdge(graph,1,3);
addEdge(graph,2,3);
addEdge(graph,3,1);
addEdge(graph,3,2);
addEdge(graph,3,4);
addEdge(graph,4,3);
print(graph.ll.get(3));
}
}
我復制了您的代碼,直到進行更改,它才編譯
public static void print(LinkedList lli)
至:
public static void print(LinkedList<Integer> lli)
從那里工作沒有問題
另外,給變量起一個以大寫字母開頭的名稱是違反命名約定的。 看一下這個oracle教程 。 頁面上的最后一個要點指出:
如果您選擇的名稱僅包含一個單詞,則用所有小寫字母拼寫該單詞。 如果它包含多個單詞,請大寫每個后續單詞的第一個字母。 名稱gearRatio和currentGear是此約定的主要示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.