java - 实例不工作?

标签 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,所以为什么...呃....

最佳答案

对于删除,您不需要检查类型。如果类型不匹配,它将不存在,并且删除无论如何都会返回 false。

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

private final Class<T> tClass;

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

您是否查看过“集合”实用程序中的“已检查集合”。它可能会做你想做的事。 http://download.oracle.com/javase/6/docs/api/java/util/Collections.html在checkedCollection、checkedList、checkedSet、checkedMap下

关于java - 实例不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6134630/

相关文章:

java - 为什么编译器在静态调用时会接受无效的语法调用(<?>方法)?

java - 为什么类型删除后信息被保存了?

java - 尝试通过不同的类查看对象的实例数据

java - JUnit测试Spring示例中的一些疑问

java - 哈希内容,然后转换为十六进制结果

java - 子进程在 Windows 中既不会完成也不会中止?

java - Xtext- doGenerate 在作为 warfile 运行时返回 xtend 符号

C# 泛型类型相等运算符

javascript - new 和 instanceof Javascript

php - 多实例检查