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

时间:2011-09-07 13:51:39

标签: java android generics

以下代码:

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

原因:

  

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

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

9 个答案:

答案 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做的最好的事情是检查tempVarArrayList(任何事情)。要以通用的方式执行此操作,请使用:

((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;
}

通过这种方式,您的代码是完全安全的。