使用ArrayList键入错误?

时间:2012-02-06 20:50:00

标签: java generics types arraylist tokenize

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行。数据由空格分隔

5 个答案:

答案 0 :(得分:4)

变化:

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

为:

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

或只是:

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

答案 1 :(得分:3)

List包含Object实例。 get()方法返回Object。如果需要类型安全列表,则必须使用泛型类型信息:

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

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

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

附注:学习缩进代码并遵守Java命名约定。这是不可读的。

答案 2 :(得分:2)

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

要解决此问题,请更改行

private static ArrayList arrayList;

阅读

private static ArrayList<String> arrayList;

这明确向Java表明您的ArrayList应该只保留String,因此它可以知道arrayList.get(i)的返回类型将是String而是而不是全能Object。同样,改变

arrayList = new ArrayList();

arrayList = new ArrayList<String>();

有关更多信息,请阅读Java Generics。它们是一个非常强大的工具,但很容易被不正确地使用(如你的情况)。一个很好的来源是Oracle的this article

希望这有帮助!

答案 3 :(得分:1)

ArrayList<String> arrayList= null;

除非指定类型,否则ArrayList get调用返回一个Object。

答案 4 :(得分:1)

在Java 7中添加了Diamond:

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