【问题标题】:Warning when I try to cast Object to List<Object>当我尝试将 Object 强制转换为 List<Object> 时发出警告
【发布时间】:2014-03-26 20:18:38
【问题描述】:

我有一个对象,它是一个列表 我的演员是:

List<Object> list = (List<Object>)o;

这似乎是正确的,但它给了我:

类型安全:未经检查地从 Object 强制转换为 数组列表

不过……我觉得这个选角是正确的。

我不想使用@suppressWarning,我想解决它。

【问题讨论】:

  • 在这种情况下,您总是会收到“未经检查的演员表”警告。
  • 那么o 来自哪里?为什么输入为Object 而不是List&lt;Object&gt;

标签: java


【解决方案1】:

代码没有编译是有原因的。考虑:

List<Integer> o = new ArrayList<Integer>();
List<Object> list = (List<Object>)o; //Or alternatively (List)o, which does compile, but with a warning
list.add("Hello");
Integer v = o.get(0); //ClassCastException!

警告/错误表明编译器无法再防范意外的 ClassCastException。

【讨论】:

  • 编译器在从 Animal 转换为 Dog 时也无法防范 ClassCastException。那又怎样?
  • @HotLicks:我说的是 unexpected ClassCastException。不是在显式演员表中发生的。请记住,Java 泛型添加了隐式转换指令,如果代码不是类型安全的,它们可能会失败。
  • 那么这是Java程序中唯​​一可能发生的“意外”故障??
  • @HotLicks:我不是这么说的。我说的是类型安全警告的存在(这里不是这种情况),及其可能的含义 - 隐式强制转换上的 ClassCastException。
  • 我的意思是你可以花太多时间担心泛型的强制转换和警告,而没有足够的时间担心你可以提高效果的 10000 种其他方法。如果你知道你在投射什么,那就去做吧。在线上发表评论以确认您正在做的事情,然后继续生活。
【解决方案2】:

您无法摆脱此警告。从Object 转换为通用对象总是会打印此警告(类型系统不能保证此步骤绝对正确,因为Object 可能几乎是所有内容)。

【讨论】:

    【解决方案3】:

    您需要给我们更多代码,看看是否有可能通过正确使用泛型来避免强制转换。

    至于你现在的问题,你无法避免这个编译器警告。只是因为我们不知道o 对象的实际类型是什么。可以是ArrayList,也可以是BigPapaSmurf

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-07
      • 2013-04-01
      相关资源
      最近更新 更多