0

这似乎是一个非常标准的问题,但它是如此简单,我不知道该怎么做。从我在 SO 其他地方读到的内容来看,这是在初始化 ArrayLists 而不指定参数时由泛型引起的。我也知道当我注释掉时警告不会出现ArrayList<Integer> p = (ArrayList<Integer>)is.readObject();,所以我很确定编译器存在泛型安全问题,因为我试图ObjectArrayList<Integer>. 我怎样才能保存ArrayList而不导致这种情况?

这是代码:

import java.util.*;
import java.io.*;

public class FileTest
{
    public static void main(String[] args)
    {
        String fileName = "fred.txt";
        ArrayList<Integer> a = new ArrayList<Integer>();
        a.add(2);
        a.add(3);
        a.add(4);
        try
        {
            ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(fileName));
            os.writeObject(a);
            os.close();
        }
        catch(FileNotFoundException e){e.printStackTrace();}
        catch(IOException e){e.printStackTrace();}
        try
        {
            ObjectInputStream is = new ObjectInputStream(new FileInputStream(fileName));
            ArrayList<Integer> p = (ArrayList<Integer>)is.readObject();
            //for(int i : p) System.out.println(i);
        }
        catch(FileNotFoundException e){e.printStackTrace();}
        catch(IOException e){e.printStackTrace();}
        catch(ClassNotFoundException e){e.printStackTrace();}
    }
}
4

1 回答 1

2

我很确定编译器存在泛型安全问题,因为我试图将 Object 强制转换为 ArrayList。

不仅仅是泛型安全问题,也是类型安全问题。您假设接下来的事情是 anArrayList并且您可以安全地将其用作ArrayList<Integer>.

如何保存 ArrayList 而不会导致这种情况?

您的问题不在于保存它,而在于将其取回。在声明之前添加@SuppressWarnings("unchecked")或添加任何内容。

于 2013-10-19T09:37:30.407 回答