如何对泛型类型列表进行 instanceof 检查?
Posted
技术标签:
【中文标题】如何对泛型类型列表进行 instanceof 检查?【英文标题】:How can i do an instanceof check on a generics type list? 【发布时间】: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<ZohoData>
。因此,检查该列表的类型甚至没有什么意义。我会说你可能在这里以错误的方式使用泛型。泛型的全部意义在于对您的列表做一些事情,这对于ZohoData
的任何实现都是通用的。
右栏显示相关问题。特别是***.com/questions/1570073/…、***.com/questions/4704902/… 和***.com/questions/5734720/…。他们会回答你的问题吗?
泛型在运行时被删除。你不能检查那些。您的参数应确保类型安全。
除此之外:牢记minimal reproducible example。总是总是总是提供足够的代码来repro问题;而不是只放一小部分代码;和描述其他部分。如果您认为您的问题已解决,请考虑将其删除。
【参考方案1】:
我过去遇到过这个问题,并找到了两种可能的方法来解决它:
-
将运行时类添加到方法签名或保存该方法的类中,这样您就知道在运行时使用的是哪种类型。
检查列表大小,如果有一项,则获取该项并检查其类型。
此外,您可以将类型检查移至完全处理/使用项目的部分。这也将消除问题。
问候,
Sem
【讨论】:
【参考方案2】:泛型仅在编译时使用,编译后类型将被删除,在运行时不再使用。 instanceof 用于检查对象的类型。所以你不能在像 List 这样的泛型类型类中使用 instanceof。要确定列表包含什么类型的对象,gem 解释的方式就足够了。
【讨论】:
以上是关于如何对泛型类型列表进行 instanceof 检查?的主要内容,如果未能解决你的问题,请参考以下文章