【问题标题】:Type error using ArrayList?使用 ArrayList 输入错误?
【发布时间】:2012-02-06 20:50:00
【问题描述】:
package mp1similar;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;
import EarthquakeRecord.Earthquakerecd;


public class MP1Similar 
{ 

private static ArrayList arrayList  ;

public static void main(String[] args) 
{
 ArrayList arrayList= null;
    try 
    {
    BufferedReader br = new BufferedReader(new FileReader("data/Catalog.txt"));

    String line="";
    arrayList =new ArrayList();
    while((line = br.readLine())!=null)
        {
      //  System.out.println(line);
        StringTokenizer st = new StringTokenizer(line);
        while(st.hasMoreTokens())
            {
          //System.out.println(st.nextToken());
            arrayList.add(st.nextToken());
            //System.out.println(br.readLine());
            }
        }
    }

    catch (FileNotFoundException ex)
    {
         System.out.println(ex.getMessage());
         ex.printStackTrace();
    }
catch (IOException ex)
    {
          System.out.println(ex.getMessage());
          ex.printStackTrace();
    }
          int j=0;
    Earthquakerecd E[]= new Earthquakerecd[2000];
     for(int i=0;i< arrayList.size();i++)
    {
        System.out.println(arrayList.get(i));
        E[j] = new Earthquakerecd();


       E[j].setDate(arrayList.get(i));



    if (j>35 )
    {
        j=0;
    } 
    j++;

    }







}

}

我在E[j].setDate(arrayList.get(i)); 行中遇到错误,它表示实际参数无法通过方法调用转换为java.lang.String

对象中的所有字段都是String 类型。 arrayList 包含从 TXT 文件中提取的所有数据。我正在尝试将所有数据从 arrayList 传输到对象数组。 txt 文件有 35 列和 1500 行。数据由空格分隔

【问题讨论】:

  • 我有一个问题,在 ArrayList 中我有 diff 数据类型,而不仅仅是字符串,我有 int、float、double,那我该怎么办?

标签: java generics types arraylist tokenize


【解决方案1】:

变化:

ArrayList arrayList = null;
...
arrayList =new ArrayList();

到:

ArrayList<String> arrayList = null;
arrayList = new ArrayList<String>();

或者只是:

ArrayList<String> arrayList = new ArrayList<String>();

【讨论】:

  • 我有一个问题,在 ArrayList 中我有 diff 数据类型,而不仅仅是字符串,我有 int、float、double,那我该怎么办?
  • 使用单独的列表来存储不同的类型:ArrayList&lt;Integer&gt;ArrayList&lt;Double&gt;
【解决方案2】:

列表包含对象实例。 get() 方法返回 Object。如果你想要一个类型安全的 List,你必须使用泛型类型信息:

List<String> list = new ArrayList<String>();

如果您使用原始类型(没有&lt;String&gt; 泛型类型信息),那么编译器不知道 List 仅包含 String 实例,因此您必须转换结果:

String s = (String) list.get(i);

旁注:学习缩进代码并尊重 Java 命名约定。它是不可读的。

【讨论】:

  • 我有一个问题,在 ArrayList 中我有 diff 数据类型,而不仅仅是字符串,我有 int、float、double,那我该怎么办?
  • 你重新设计你的程序,因为在一个列表中有多种数据真的很不正常。
【解决方案3】:

我认为问题在于您使用的是原始的ArrayList 类型,而不是使用参数化的ArrayList。因此,ArrayList 上的所有操作都将假定参数和返回类型是Object 而不是String,因为您没有向Java 表明您希望ArrayList 保持Strings。如果没有您提供的这些额外信息,Java 无法知道存储在其中的对象仅是 Strings,而不是 Integers、其他 ArrayLists、JPanels 等。

要解决此问题,请更改行

private static ArrayList arrayList;

阅读

private static ArrayList<String> arrayList;

这向 Java 明确表明您的 ArrayList 应该只包含 Strings,因此它可以知道 arrayList.get(i) 的返回类型将是 String 而不是包罗万象的 Object .同样,改变

arrayList = new ArrayList();

arrayList = new ArrayList<String>();

有关更多信息,请阅读 Java 泛型。它们是一个非常强大的工具,但很容易被不当使用(就像你的情况一样)。一个不错的来源是 Oracle 的 this article

希望这会有所帮助!

【讨论】:

  • 我有一个问题,在 ArrayList 中我有 diff 数据类型,而不仅仅是字符串,我有 int、float、double,那我该怎么办?
  • 如果您确实有多种数据类型,那么您有两种选择。首先,您可以使用ArrayList&lt;Object&gt; 并将所有内容统一视为Objects。或者,您可以使用ArrayList&lt;Object&gt;,然后在知道该类型是什么后使用类型转换将对象转换回其真实类型。
【解决方案4】:
ArrayList<String> arrayList= null;

ArrayList get 调用返回一个对象,除非你指定类型。

【讨论】:

  • 我有一个问题,在 ArrayList 中我有 diff 数据类型,而不仅仅是字符串,我有 int、float、double,那我该怎么办?
【解决方案5】:

钻石是在 Java 7 中添加的:

ArrayList<String> arrayList = new ArrayList<>();

【讨论】:

  • 我有一个问题,在 ArrayList 中我有 diff 数据类型,而不仅仅是字符串,我有 int、float、double,那我该怎么办?
猜你喜欢
  • 2012-05-24
  • 1970-01-01
  • 2014-03-02
  • 1970-01-01
  • 2011-05-01
  • 2020-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多