【发布时间】: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的任何实现都是通用的。 -
泛型在运行时被删除。你不能检查那些。您的参数应确保类型安全。
-
除此之外:牢记minimal reproducible example。总是总是总是提供足够的代码来repro问题;而不是只放一小部分代码;和描述其他部分。如果您认为您的问题已解决,请考虑将其删除。
标签: java generics instanceof