为了账号安全,请及时绑定邮箱和手机立即绑定

Java:Instanceof和泛型

Java:Instanceof和泛型

紫衣仙女 2019-12-20 11:17:12
在查看通用数据结构中的值索引之前,我想看看它是否甚至this已被参数化为该类型的实例。但是当我这样做时,Eclipse会抱怨:@Overridepublic int indexOf(Object arg0) {    if (!(arg0 instanceof E)) {        return -1;    }这是错误消息:无法针对类型参数E执行instanceof检查。请改用其擦除对象,因为泛型类型信息将在运行时删除有什么更好的方法呢?
查看完整描述

3 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

错误消息说明了一切。在运行时,该类型已消失,无法对其进行检查。


您可以通过为对象创建工厂来捕获它,如下所示:


 public static <T> MyObject<T> createMyObject(Class<T> type) {

    return new MyObject<T>(type);

 }

然后在对象的构造函数中存储该类型,变量,以便您的方法如下所示:


        if (arg0 != null && !(this.type.isAssignableFrom(arg0.getClass()))

        {

            return -1;

        }


查看完整回答
反对 回复 2019-12-20
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

如果您的类扩展了具有通用参数的类,则您还可以在运行时通过反射来获取它,然后将其用于比较,即


class YourClass extends SomeOtherClass<String>

{


   private Class<?> clazz;


   public Class<?> getParameterizedClass()

   {

      if(clazz == null)

      {

         ParameterizedType pt = (ParameterizedType)this.getClass().getGenericSuperclass();

          clazz = (Class<?>)pt.getActualTypeArguments()[0];

       }

       return clazz;

    }

}

在上述情况下,在运行时将从getParameterizedClass()中获取String.class并进行缓存,因此在进行多次检查时不会有任何反射开销。请注意,您可以从ParameterizedType.getActualTypeArguments()方法中通过索引获取其他参数化类型。


查看完整回答
反对 回复 2019-12-20
  • 3 回答
  • 0 关注
  • 1973 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信