instanceof不工作?

时间:2011-05-26 06:36:17

标签: java generics instanceof

我正在尝试创建一个实现Collection的类,所以它必须有删除Object的方法,所以我想我只是重用我已创建的方法来删除一个对象泛型类型T,但它会引发编译时错误。为什么这不起作用?

代码


public class ArrayPP<T> implements Collection<T>
{
  public boolean remove(Object o)
  {
    if (o instanceof T)
      remove((T)o, true);
    else
      return false;
    return true;
  }
}

错误


ArrayPP.java:5: unexpected type
found   : T
required: class or array
    if (o instanceof T)

为什么,Java?


我用

解决了这个问题
if (t.getClass().isInstance(o))
  remove((T)o, true);
else
  return false;
return true;

但是......我的意思是,如果有人编码“ArrayPP<String> a = new ArrayPP<String>();”,您知道TString,对吧?那么为什么在运行时期间无法看到oString?我的意思是,如果我要做a.add('c');,它就不会编译,因为它知道,add(T item)中的ArrayPP方法只会接受String s,那么为什么......呃......

4 个答案:

答案 0 :(得分:4)

要删除,您无需检查类型。如果类型不匹配则不会存在,并且remove仍会返回false。

如果要动态检查add(T t),则需要将类型存储在字段中。

private final Class<T> tClass;

public boolean add(T t) {
   return tClass.isInstanceof(t) && collection.add(t);
}

您是否查看过Collections实用程序中的Checked Collection。它可能会做你想要的。 checkCollection,checkedList,checkedSet,checkedMap

下的http://download.oracle.com/javase/6/docs/api/java/util/Collections.html

答案 1 :(得分:3)

您不能将instanceof用于通用参数类型。那是因为在运行时没有关于T的信息。

您应该阅读一些关于泛型的教程/文档。大多数教程通常会解释这种情况。

答案 2 :(得分:2)

由于类型擦除,

instanceof不能与泛型类型一起使用 - 运行时没有T

由于T在运行时不存在,instanceof T应该做什么? instanceof onull应该做什么?

一个icky workabout是使用getClass()并根据它做出决定。

快乐的编码。

答案 3 :(得分:2)

T是泛型类型参数。通用类型信息在运行时被擦除。所以你不能检查一个对象是否是T的实例。