【问题标题】:Warning when reading non-generic HashMap from InputStream从 InputStream 读取非泛型 HashMap 时出现警告
【发布时间】:2016-03-23 17:02:34
【问题描述】:

我有一个实例变量HashMap<String, Object> sessions;

我正在尝试从输入流中读取 HashMap<String, Object> 的已保存实例:

ObjectInputStream is = new ObjectInputStream(fis);
sessions = (HashMap<String, Object>) is.readObject();

但是在第二行我收到以下警告:

Unchecked cast: 'java.lang.Object' to 'java.util.HashMap&lt;java.lang.String,java.lang.Object&gt;'

它为我提供了泛型类,它完全没有做任何事情。我尝试将实例变量更改为原始的通用HashMap,并相应地转换为原始HashMap,但是每当我尝试将任何内容放入哈希映射时,我都会收到未经检查的警告,例如:

sessions.put("all", new ArrayList());

产生警告Unchecked call to 'put(K, V)' as a member of raw type 'java.util.HashMap'

我知道这些只是警告,不会在运行时造成问题,但为了正确起见,我怎样才能摆脱所有警告?

我使用的是 Android Studio 2.0b7。

【问题讨论】:

  • 您可以从ObjectInputStream 中读取任何内容——如果您尝试将读取的对象转换为Object 以外的任何内容,您将始终得到未经检查的转换。摆脱第一个警告的唯一方法是添加@SuppressWarnings。
  • 并且不要使用原始类型方法。
  • @AndyTurner 是的,我想尽可能避免生吃,这就是为什么我试图摆脱警告并确保一切都“强大”。正如您和米哈伊尔建议的那样,添加 @SuppressWarnings 解决了这个问题。

标签: java generics android-studio casting


【解决方案1】:

编译器无法知道您将在运行时从 ObjectInputStream 读取什么类型,因此如果您尝试显式转换它,您将始终收到未经检查的转换警告。

唯一的解决方案是添加@SuppressWarnings。最好为未经检查的强制转换专门添加一个局部变量,因为您可以只注释这个,而不是整个方法或类。

@SuppressWarnings("unchecked")
HashMap<String, Object> tmp = (HashMap<String, Object>) input.readObject();
sessions = tmp;

但是,您还应该检查您读取的对象instanceof HashMap,以确保未经检查的强制转换至少部分安全(部分是因为您不知道值和键是否真的是您期望的类型- 确保您可以迭代键以确保它们都是字符串)。

【讨论】:

    【解决方案2】:

    只需在代码行中添加@SuppressWarnings("unchecked") 注释即可。可以将此注解添加到方法或类中。

    【讨论】:

      【解决方案3】:

      泛型类型信息未序列化,因为它在运行时被type erasure 删除。

      反序列化后无法得到准确的泛型对象。因为变量级泛型信息仅在编译时存在。

      如果可能的话,ObjectInputStream 会提供一种传递对象类型的方法,但它不会。

      只有Generic Class Types 才能访问类型信息。使用这个 hack SpringJackson 提供了一种传递类型以从流中读取的方法。

      您可以为接收类型的readObject 的自定义实现编写一个实用程序类(使用Spring 或Jackson TypeReference 或者可能是您自己的更简单的实现)。在那里,您可以检查读取的对象是否是正确的类型,如果它使用传递的类型,则可以将其强制转换为正确的类型。这样一来,您将不得不在一个地方禁止警告,并且您将确保正在读取的对象是正确的类型。

      【讨论】:

        猜你喜欢
        • 2010-11-19
        • 2015-08-18
        • 2014-06-08
        • 1970-01-01
        • 1970-01-01
        • 2013-06-14
        • 2014-02-16
        • 1970-01-01
        • 2015-07-15
        相关资源
        最近更新 更多