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有没有在运行时的参数化类型的信息,有没有办法,你可以做一个instanceof的ArrayList<Foo>.您可以显式"存储"参数化类型并在那里进行比较.
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)
Pau*_*ora 10
由于类型擦除,ArrayList在运行时将不知道参数化类型.你能做的最好的事情instanceof就是检查是否tempVar是ArrayList(任何东西).要以通用的方式执行此操作,请使用:
((tempVar instanceof ArrayList<?>) ? tempVar : null);
Run Code Online (Sandbox Code Playgroud)