如何知道一个java对象是否是一个列表

Hic*_*aru 3 java list instanceof

我想知道如何询问 java 对象是 List 还是 ArrayList。

例如:

if (Object instanceof List <?>)) {
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

PS:我有几个不同类型的列表,无论它们包含什么类型的数据,我都想为任何列表实现该方法。

Ste*_*n C 5

要测试实例是 aList还是ArrayList1,只需使用instanceof.

请注意,根据 JLS 15.20.2,运算instanceof符的类型操作数必须是可具体化的类型,并且在 JLS 4.7 中定义为:

  • 一个参数化类型,其中所有类型参数都是无界通配符,
  • 原始类型
  • 原始类型(在此上下文中不适用
  • 元素类型可具体化的数组类型,或
  • 嵌套类型,其中每个封闭类型也是可具体化的。

所以这两个都应该是有效的:

if (obj instanceof List)) {     // raw type
    // Do something
}
if (obj instanceof List <?>)) { // type parameter is an unbounded wildcard
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

但这将是一个编译错误:

if (obj instanceof List <Integer>)) {
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

我有几个不同类型的列表,并希望为任何列表实现该方法,无论它们包含什么类型的数据。

那没问题。

(但是,如果您希望该方法仅适用于具有某些类型数据的列表,这将是一个问题……基于简单的运行时类型检查。泛型类型的类型参数在运行时测试中不可用,因此您需要单独测试列表的每个元素......)


1 -请注意,任何ArrayList的也是一个List......因为ArrayList类实现了List接口。