以下代码:
((tempVar instanceof ArrayList<Foo>) ? tempVar : null);
原因:
无法对参数化类型
instanceof
执行ArrayList<Foo>
检查。请改用ArrayList<?>
形式,因为在运行时将删除其他通用类型信息
有人可以解释一下“在运行时将删除更多通用类型信息”的含义以及如何解决这个问题?
答案 0 :(得分:52)
这意味着如果你有任何参数化的东西,例如List<Foo> fooList = new ArrayList<Foo>();
,泛型信息将在运行时被删除。相反,这就是JVM将看到的List fooList = new ArrayList();
。
这称为type erasure。在运行时期间,JVM没有List
(在示例中)的参数化类型信息。
修复?由于JVM在运行时没有参数化类型的信息,因此您无法执行instanceof
ArrayList<Foo>
。您可以显式“存储”参数化类型并在那里进行比较。
答案 1 :(得分:26)
你总是可以这样做
try
{
if(obj instanceof ArrayList<?>)
{
if(((ArrayList<?>)obj).get(0) instanceof MyObject)
{
// do stuff
}
}
}
catch(NullPointerException e)
{
e.printStackTrace();
}
答案 2 :(得分:10)
由于类型擦除,ArrayList
的参数化类型在运行时将不知道。您可以使用instanceof
做的最好的事情是检查tempVar
是ArrayList
(任何事情)。要以通用的方式执行此操作,请使用:
((tempVar instanceof ArrayList<?>) ? tempVar : null);
答案 3 :(得分:2)
这就足够了:
if(obj instanceof ArrayList<?>)
{
if(((ArrayList<?>)obj).get(0) instanceof MyObject)
{
// do stuff
}
}
事实上,instanceof
检查左操作数是否为null
,如果实际为false
,则返回null
。
所以:不需要抓住NullPointerException
。
答案 4 :(得分:1)
你无法解决这个问题。 Generics的类型信息在运行时不可用,您将无法访问它。您只能检查数组的内容。
答案 5 :(得分:1)
instanceof运算符在运行时工作。但java在运行时不携带参数化类型信息。它们在编译时被删除。因此错误。
答案 6 :(得分:0)
你总是可以这样做
创建一个类
public class ListFoo {
private List<Foo> theList;
public ListFoo(List<Foo> theList {
this.theList = theLista;
}
public List<Foo> getList() {
return theList;
}
}
不一样但是......
myList = new ArrayList<Foo>;
.....
Object tempVar = new ListFoo(myList);
....
((tempVar instanceof ListFoo) ? tempVar.getList() : null);
答案 7 :(得分:0)
您可以使用
<html>
<head>
<title>Test</title>
</head>
<body>
<h1>Whatever it takes</h1>
<h1>Whatever it takes</h1>
<h1>Whatever it takes</h1>
<h1>Whatever it takes</h1>
<h1>Whatever it takes</h1>
<h1>Whatever it takes</h1>
<h1>Whatever it takes</h1>
<h1>Whatever it takes</h1>
<h1>Whatever it takes</h1>
<h1>Whatever it takes</h1>
<h1>Whatever it takes</h1>
<h1>Whatever it takes</h1>
<h1>Whatever it takes</h1>
<h1>Whatever it takes</h1>
<h1>Whatever it takes</h1>
<h1>Whatever it takes</h1>
<h1>Whatever it takes</h1>
<h1>Whatever it takes</h1>
<h1>Whatever it takes</h1>
<h1>Whatever it takes</h1>
<div class="mask"></div>
</body>
</html>
答案 8 :(得分:0)
要执行精确的检查类型而不是这样:
.zshrc
你可以这样做:
protected <Foo> ArrayList<Foo> myMethod(Object tempVar ) {
return tempVar instanceof ArrayList<Foo>) ? (ArrayList<Foo>) tempVar : null;
}
通过这种方式,您的代码是完全安全的。