【问题标题】:How can i do an instanceof check on a generics type list?如何对泛型类型列表进行 instanceof 检查?
【发布时间】:2017-11-29 06:33:30
【问题描述】:

我正在编写一个方法,它可以采用 3 个不同对象的不同列表,每个对象都扩展同一个超类。方法签名如下所示:

private void writeObjectToCsv(File file, List<? extends ZohoData> rawDataView)

我需要知道哪个列表已作为参数传递,所以我想像这样使用 instanceof 检查:

if (rawDataView instanceof List<ZohoChatData>)

但是,这给了我一个错误,提示“instanceof 的泛型类型非法”(ZohoChatData 在 IDE 中标记为红色)。 ZohoChatdata 扩展了 ZohoData,所以我不明白为什么编译器会给我这个错误。有人知道吗?

谢谢。

【问题讨论】:

  • 您必须在列表的每个元素上使用instanceof,而不是列表本身,因为列表可能包含ZohoData 的多个不同(子)实例。
  • 我相信由于类型擦除,在运行时第二个参数变为List&lt;ZohoData&gt;。因此,检查该列表的类型甚至没有什么意义。我会说你可能在这里以错误的方式使用泛型。泛型的全部意义在于对您的列表做一些事情,这对于ZohoData 的任何实现都是通用的。
  • 右栏显示相关问题。特别是stackoverflow.com/questions/1570073/…stackoverflow.com/questions/4704902/…stackoverflow.com/questions/5734720/…。他们会回答你的问题吗?
  • 泛型在运行时被删除。你不能检查那些。您的参数应确保类型安全。
  • 除此之外:牢记minimal reproducible example。总是总是总是提供足够的代码来repro问题;而不是只放一小部分代码;和描述其他部分。如果您认为您的问题已解决,请考虑将其删除。

标签: java generics instanceof


【解决方案1】:

我过去遇到过这个问题,并找到了两种可能的方法来解决它:

  1. 将运行时类添加到方法签名或保存该方法的类中,这样您就知道在运行时使用的是哪种类型。
  2. 检查列表大小,如果有一项,则获取该项并检查其类型。

此外,您可以将类型检查移至完全处理/使用项目的部分。这也将消除问题。

问候,

Sem

【讨论】:

    【解决方案2】:

    泛型仅在编译时使用,编译后类型将被删除,在运行时不再使用。 instanceof 用于检查对象的类型。所以你不能在像 List 这样的泛型类型类中使用 instanceof。要确定列表包含什么类型的对象,gem 解释的方式就足够了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-01
      • 2018-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多