0

我正在尝试创建一个实现 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)

为什么,爪哇?


我已经解决了

if (t.getClass().isInstance(o))
  remove((T)o, true);
else
  return false;
return true;

但是......我的意思是如果有人编码“ ArrayPP<String> a = new ArrayPP<String>();”,你知道那TString,对吧?那么为什么在运行时看不到是否o是 a String?我的意思是,如果我这样做a.add('c');,它不会编译,因为它知道,这里的add(T item)方法ArrayPP只会接受Strings,所以为什么......呃......

4

4 回答 4

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。它可能会做你想做的事。 http://download.oracle.com/javase/6/docs/api/java/util/Collections.html下checkedCollection、checkedList、checkedSet、checkedMap

于 2011-05-26T06:42:44.987 回答
3

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

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

于 2011-05-26T06:39:48.943 回答
2

instanceof由于类型擦除,不能与泛型类型一起使用——T在运行时没有。

既然T在运行时不存在,应该instanceof T怎么办?什么时候应instanceof该做什么?onull

一个棘手的工作是使用它getClass()并根据它做出决定。

快乐编码。

于 2011-05-26T06:40:43.977 回答
2

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

于 2011-05-26T06:43:44.203 回答