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

Can*_*ner 51 java generics android

以下代码:

((tempVar instanceof ArrayList<Foo>) ? tempVar : null);
Run Code Online (Sandbox Code Playgroud)

原因:

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

有人可以解释一下"在运行时将删除更多通用类型信息"的含义以及如何解决这个问题?

Buh*_*ndi 52

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

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

修复?由于JVM有没有在运行时的参数化类型的信息,有没有办法,你可以做一个instanceofArrayList<Foo>.您可以显式"存储"参数化类型并在那里进行比较.

  • `您可以明确地"存储"参数化类型并在那里进行比较.我们可以看一个这样的例子吗? (9认同)

Gre*_*reg 26

你总是可以这样做

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

  • 如果它是空的怎么样 (8认同)

Pau*_*ora 10

由于类型擦除,ArrayList在运行时将不知道参数化类型.你能做的最好的事情instanceof就是检查是否tempVarArrayList(任何东西).要以通用的方式执行此操作,请使用:

((tempVar instanceof ArrayList<?>) ? tempVar : null);
Run Code Online (Sandbox Code Playgroud)