猿问

Java:Instanceof和泛型

在查看通用数据结构中的值索引之前,我想看看它是否甚至this已被参数化为该类型的实例。


但是当我这样做时,Eclipse会抱怨:


@Override

public int indexOf(Object arg0) {

    if (!(arg0 instanceof E)) {

        return -1;

    }

这是错误消息:


无法针对类型参数E执行instanceof检查。请改用其擦除对象,因为泛型类型信息将在运行时删除


有什么更好的方法呢?


紫衣仙女
浏览 1974回答 3
3回答

阿晨1998

错误消息说明了一切。在运行时,该类型已消失,无法对其进行检查。您可以通过为对象创建工厂来捕获它,如下所示:&nbsp;public static <T> MyObject<T> createMyObject(Class<T> type) {&nbsp; &nbsp; return new MyObject<T>(type);&nbsp;}然后在对象的构造函数中存储该类型,变量,以便您的方法如下所示:&nbsp; &nbsp; &nbsp; &nbsp; if (arg0 != null && !(this.type.isAssignableFrom(arg0.getClass()))&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return -1;&nbsp; &nbsp; &nbsp; &nbsp; }

慕丝7291255

如果您的类扩展了具有通用参数的类,则您还可以在运行时通过反射来获取它,然后将其用于比较,即class YourClass extends SomeOtherClass<String>{&nbsp; &nbsp;private Class<?> clazz;&nbsp; &nbsp;public Class<?> getParameterizedClass()&nbsp; &nbsp;{&nbsp; &nbsp; &nbsp; if(clazz == null)&nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ParameterizedType pt = (ParameterizedType)this.getClass().getGenericSuperclass();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; clazz = (Class<?>)pt.getActualTypeArguments()[0];&nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; &nbsp;return clazz;&nbsp; &nbsp; }}在上述情况下,在运行时将从getParameterizedClass()中获取String.class并进行缓存,因此在进行多次检查时不会有任何反射开销。请注意,您可以从ParameterizedType.getActualTypeArguments()方法中通过索引获取其他参数化类型。
随时随地看视频慕课网APP

相关分类

Java
我要回答