java - 不安全的强制转换问题,如何强制类型安全?

标签 java serialization

我不知道如何转换 Object进入ArrayList<Account>因为我所做的序列化是 ArrayList<Accounts> 类型。据我所知,这段代码应该可以工作。

当前反序列化代码:

ArrayList<Accounts> alst = new ArrayList<Accounts>();
try {
  ObjectInputStream ain = new ObjectInputStream(new BufferedInputStream(new FileInputStream("accounts.ser")));  
  Object o = ain.readObject();
  if(o instanceof ArrayList) {          
    alst = (ArrayList<Accounts>) o;
  }
  else {
    System.out.println("Big problem!!!");
  }

  ain.close();
}

我遇到了问题:

warning: 
[unchecked] unchecked cast
required: ArrayList<Account>.
found:    Object

我已经阅读了很多关于这个问题的帖子,但我就是无法让它解决我的问题。我几天来一直在研究这个问题,但没有运气!我知道这是我在反序列化文件时遇到的问题。如何从 Object 恢复到原来的类型?

还有别的办法吗?

最佳答案

你的麻烦不是降格为ArrayList ,但进入 ArrayList<Account> .

如果没有未经检查的强制转换警告,则无法向下强制转换为泛型类型。这是由于 Java 泛型的核心本质:在运行时没有与实例关联的类型参数信息。您将不得不接受该警告,或者使用 SuppressWarnings("Unchecked") 抑制它。方法或表达式上的注释。

此外,您似乎对强制转换与转换感到困惑:向下转换(这就是您在那里所做的)不会转换任何内容,它只是允许将对象视为它是你将其转换到的类型。您的对象已经属于 ArrayList 类型;您的变量的类型为 Object 。请学会欣赏 Java 中的这些差异,它们对于理解和编写代码至关重要。

关于java - 不安全的强制转换问题,如何强制类型安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16770760/

相关文章:

java - 是否可以跨 Java 模块使用 SharedSecrets?

java - 线程是否应该有特殊设计才能被 Tomcat 正常关闭?

c# - 具有继承自 Dictionary<T,V> 的类的 JSON 序列化

c++ - 如何使用 boost::multiprecision::mpq_rational 对带有模板类的 map 进行反序列化/序列化

python libxml2序列化问题

java - 使用 mongoDB 的 Spring 启动返回 NullPointerException

java - 异构数组列表

java - 按下任意键时如何清除文本字段?

c# - 反序列化具有未知元素顺序的 XML

java - 属性未记录在序列化arraylist中