无法对参数化类型 ArrayList<Foo 执行实例检查>

2022-08-31 16:40:11

下面的代码:

((tempVar instanceof ArrayList<Foo>) ? tempVar : null);

原因:

无法对参数化类型 执行检查。请改用表单,因为将在运行时擦除其他泛型类型信息instanceofArrayList<Foo>ArrayList<?>

有人可以解释一下“进一步的泛型类型信息将在运行时被删除”是什么意思以及如何解决这个问题?


答案 1

这意味着,如果您有任何参数化的内容,例如,泛型信息将在运行时被删除。相反,这是JVM将看到的。List<Foo> fooList = new ArrayList<Foo>();List fooList = new ArrayList();

这称为类型擦除。JVM 在运行时没有(在示例中)的参数化类型信息。List

修复?由于 JVM 在运行时没有参数化类型的信息,因此您无法执行 .您可以显式“存储”参数化类型并在那里进行比较。instanceofArrayList<Foo>


答案 2

您始终可以执行此操作

try
{
    if(obj instanceof ArrayList<?>)
    {
        if(((ArrayList<?>)obj).get(0) instanceof MyObject)
        {
            // do stuff
        }
    }
}
catch(NullPointerException e)
{
    e.printStackTrace();
}

推荐