在查看一个值的索引的通用数据结构之前,我想看看它是否是this类型的实例。
但是Eclipse抱怨我这样做:
@Override
public int indexOf(Object arg0) {
if (!(arg0 instanceof E)) {
return -1;
}这是错误消息:
无法对类型参数执行实例检查。请使用它的擦除对象,因为泛型类型信息将在运行时被擦除
有什么更好的方法去做呢?
发布于 2009-10-15 03:10:39
错误信息说明了一切。在运行时,类型消失了,因此无法检查它。
您可以通过为对象创建一个工厂来捕获它,如下所示:
public static <T> MyObject<T> createMyObject(Class<T> type) {
return new MyObject<T>(type);
}然后在对象的构造函数中存储该类型,这样可以使您的方法看起来如下所示:
if (arg0 != null && !(this.type.isAssignableFrom(arg0.getClass())) {
return -1;
}发布于 2013-06-12 17:53:18
两种使用泛型进行运行时类型检查的选项:
选项1-损坏构造函数
让我们假设您正在重写indexOf(.),并且您只想检查类型的性能,以节省迭代整个集合的时间。
创建这样一个肮脏的构造函数:
public MyCollection<T>(Class<T> t) {
this.t = t;
}然后可以使用isAssignableFrom检查类型。
public int indexOf(Object o) {
if (
o != null &&
!t.isAssignableFrom(o.getClass())
) return -1;
//...每次实例化对象时,都必须重复:
new MyCollection<Apples>(Apples.class);你可能会觉得这不值得。在ArrayList.indexOf(.)的实现中,它们不检查类型是否匹配。
选项2-让它失败
如果您需要使用一个需要未知类型的抽象方法,那么您真正想要的就是编译器不要再为实例而哭泣了。如果您有这样的方法:
protected abstract void abstractMethod(T element);你可以这样使用它:
public int indexOf(Object o) {
try {
abstractMethod((T) o);
} catch (ClassCastException e) {
//...您将对象转换为T(泛型类型),只是为了欺骗编译器。您的演员在运行时什么也不做。,但是当您试图将错误类型的对象传递到抽象方法时,仍然会得到一个ClassCastException。
注1:如果您在抽象方法中执行其他未选中的强制转换,您的ClassCastExceptions将在这里被捕获。这可能是好的也可能是坏的,所以好好想想。
注2:当您使用instanceof时,将得到一个免费的空检查。。因为您不能使用它,所以您可能需要徒手检查它是否为空。
发布于 2015-02-18 10:04:33
旧的帖子,但是一种简单的方法来做一般的instanceOf检查。
public static <T> boolean isInstanceOf(Class<T> clazz, Class<T> targetClass) {
return clazz.isInstance(targetClass);
}https://stackoverflow.com/questions/1570073
复制相似问题