获取java.lang.Object无法转换为java.lang.Integer

时间:2016-02-13 05:50:05

标签: java linked-list

我在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数组,每个链表都是图的顶点。

但是,我得到的java.lang.Object无法在第24行转换为java.lang.Integer。对于为什么我收到此错误一无所知。关于我缺少什么的任何建议?

3 个答案:

答案 0 :(得分:1)

声明这样的打印方法:

#home-arrow:hover

然后它会知道lli的内容是整数。

答案 1 :(得分: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更改为ll = new LinkedList[size] 。这意味着lli中的每个对象都是Integer的一个实例,因此迭代不会失败。

当我尝试运行您的代码时,我的IDE会向我发出有关该行的警告

ArrayList<LinkedList<Integer>>

话说:

  

未选中的赋值:'java.util.LinkedList []'到'java.util.LinkedList&lt; java.lang.Integer&gt; []'

这表明这里发生了一些可疑的事情。

混合列表和数组使用泛型键入会有点麻烦 - 如果需要大小可变性,则只需执行列表列表就会更容易和更清晰,如果不需要,则可以使用多维数组。对于您的情况,这需要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)); } } 等。

我们可以通过解决一般性问题来解决问题:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/CCLL"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#303e73"
android:orientation="vertical">


<LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight=".3">

    <ListView
        android:isScrollContainer="false"
        android:stackFromBottom="true"
        android:inputType="textMultiLine"
        android:maxLines="4"
        android:background="#26315c"
        android:id="@+id/messagesLV"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_gravity="center_horizontal"
        android:transcriptMode="alwaysScroll"/>

</LinearLayout>




<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="3"
    android:background="#303e73"
    android:orientation="horizontal">

    <ImageButton
        android:layout_gravity="center"
        android:id="@+id/addimgbtn"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:scaleType="centerCrop"
        android:padding="25dp"
        android:background="#303e73"
        android:src="@mipmap/whiteadd" />

    <EditText
        android:id="@+id/messageET"
        android:layout_weight=".5"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:isScrollContainer="true"
        android:minHeight="120dp"
        android:textColorHint="#FFFFFF"
        android:inputType="textMultiLine"
        android:hint="Enter your Message..." />


    <ImageButton
        android:id="@+id/sendbtn"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:scaleType="centerCrop"
        android:padding="25dp"
        android:background="#303e73"
        android:src="@mipmap/whitesend" />

</LinearLayout>

答案 2 :(得分:0)

我复制了你的代码,直到我改变了

才编译
public static void print(LinkedList lli)

为:

public static void print(LinkedList<Integer> lli)

从哪里工作没有问题

同时为变量提供一个以大写字母开头的名称与命名约定相对。看看this oracle tutorial。页面上的最后一个要点指出:

  

如果您选择的名称只包含一个单词,则拼写全部小写字母。如果它由多个单词组成,则将每个后续单词的首字母大写。名称gearRatio和currentGear是此约定的主要示例。