2016-02-13 68 views
-1

我正在Java中實現Graph數據結構。 這是我實現:獲取java.lang.Object不能轉換爲java.lang.Integer

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爲與圖的頂點每個鏈接列表中的圖形數組。

但是,我得到一個java.lang.Object無法轉換爲行號24 java.lang.Integer。我知道爲什麼會出現此錯誤。有什麼建議,我錯過了什麼?

+0

不應該從圖表構建包含this.ll(類似this.size)?請發佈完整的錯誤堆棧,問題沒有解決。 –

回答

1

您遇到的具體問題與您的打印功能:

public static void print(LinkedList lli){ 
     for(Integer i: lli) 
      System.out.println(i); 
} 

LinkedList是原始類型,這意味着你失去了什麼類型的對象存儲在列表類型的信息。作爲一般規則,raw types are a bad idea。我很驚訝你的代碼編譯,但足以說,通過說Integer i : lli你假設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)); 
    } 
} 
+0

Thx很多。這真的有幫助:) –

+0

雖然你是正確的未經檢查的任務和你的代碼編譯,這不是真正的問題..它已經足以改變方法簽名爲'打印(LinkedList lli)' –

+0

啊耶,現在我明白了。無論如何,完全解決泛型問題確實解決了這個問題。更新 – Mshnik

1

聲明的打印方法是這樣的:

public static void print(LinkedList<Integer> lli) 

然後,它會知道LLI的內容都是整數。

0

我複製你的代碼,並沒有編譯,直到我換

public static void print(LinkedList lli) 

到:

public static void print(LinkedList<Integer> lli) 

從那裏工作沒有問題

還贈送變量,開頭的名稱用大寫字母反對命名約定。看看this oracle tutorial。頁面上的最後一個要點指出:

如果您選擇的名稱只包含一個單詞,則拼寫該單詞的全部小寫字母。如果它包含多個單詞,請將每個後續單詞的首字母大寫。 gearRatio和currentGear這些名稱是這個約定的主要例子。

相關問題