簡體   English   中英

無法將獲取java.lang.Object轉換為java.lang.Integer

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM