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

Posted

技术标签:

【中文标题】保存ArrayLists时由泛型引起的Java编译器警告[重复]【英文标题】:Java compiler warning caused by generics when saving ArrayLists [duplicate] 【发布时间】:2013-10-19 06:12:59 【问题描述】:

这似乎是一个非常标准的问题,但它太简单了,我不知道该怎么办。从我在 SO 其他地方读到的内容来看,这是由泛型在初始化 ArrayList 时未指定参数引起的。我也知道当我注释掉ArrayList<Integer> p = (ArrayList<Integer>)is.readObject(); 时不会出现警告,所以我很确定编译器存在泛型安全问题,因为我试图将Object 转换为ArrayList<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();
    

【问题讨论】:

好了,哈哈。谢谢你。 【参考方案1】:

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

不仅仅是泛型安全问题,也是类型安全问题。您假设接下来是ArrayList,并且您可以安全地将其用作ArrayList&lt;Integer&gt;.

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

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

【讨论】:

+1 我认为你已经搞定了

以上是关于保存ArrayLists时由泛型引起的Java编译器警告[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java基础教程——泛型

泛型 Generic 类型擦除引起的问题及解决方法

为啥为非泛型方法或构造函数提供显式类型参数会编译?

Java 基础篇之泛型

Java泛型

12Java泛型