保存ArrayLists时由泛型引起的Java编译器警告

Java compiler warning caused by generics when saving ArrayLists

本问题已经有最佳答案,请猛点这里访问。

这似乎是一个相当标准的问题,但它太简单了,我不知道该怎么办。从我在其他地方读到的内容来看,这是由于在不指定参数的情况下初始化ArrayList时的泛型造成的。我也知道,当我评论ArrayList p = (ArrayList)is.readObject();时,警告不会出现,所以我很确定编译器存在一个泛型安全问题,我试图将Object强制转换为ArrayList。我怎样才能在不造成这种情况的情况下拯救ArrayList

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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();}
    }
}


I'm pretty sure there is a generics safety issue with the compiler by me trying to cast the Object to an ArrayList.

不仅仅是一个普通安全问题,一个类型安全问题。你假设接下来的事情是一个ArrayList,你可以安全地将它作为ArrayList.使用。

How can I save the ArrayList without causing this?

你的问题不在于保存它,而在于取回它。在声明前加上@SuppressWarnings("unchecked")或其他内容。