我正在尝试创建一个实现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>();
”,您知道T
是String
,对吧?那么为什么在运行时期间无法看到o
是String
?我的意思是,如果我要做a.add('c');
,它就不会编译,因为它知道,add(T item)
中的ArrayPP
方法只会接受String
s,那么为什么......呃......
答案 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
o
时null
应该做什么?
一个icky workabout是使用getClass()
并根据它做出决定。
快乐的编码。
答案 3 :(得分:2)
T是泛型类型参数。通用类型信息在运行时被擦除。所以你不能检查一个对象是否是T的实例。