如何对泛型类型列表进行 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&lt;ZohoData&gt;。因此,检查该列表的类型甚至没有什么意义。我会说你可能在这里以错误的方式使用泛型。泛型的全部意义在于对您的列表做一些事情,这对于ZohoData 的任何实现都是通用的。 右栏显示相关问题。特别是***.com/questions/1570073/…、***.com/questions/4704902/… 和***.com/questions/5734720/…。他们会回答你的问题吗? 泛型在运行时被删除。你不能检查那些。您的参数应确保类型安全。 除此之外:牢记minimal reproducible example。总是总是总是提供足够的代码来repro问题;而不是只放一小部分代码;和描述其他部分。如果您认为您的问题已解决,请考虑将其删除。 【参考方案1】:

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

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

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

问候,

Sem

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于如何对泛型类型列表进行 instanceof 检查?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中对泛型类型指定多个约束?

为啥 Java 泛型不允许对泛型类型进行类型转换?

未经检查的强制转换:尝试在同一方法中将 Int 或 String 强制转换为 T(泛型类型)

一段代码引发对泛型的重新认识

对泛型的理解

对泛型编程中泛型类型的一些理解