java 如何在类型转换时检查List<MyType>中的类型

今天在写代码的时候,在将object 转换为List<MyType>的时候编译器给了我一个警告

未经检验的类型转换

Unchecked cast: 'java.lang.Object' to 'java.util.List<edu.dlu.bysj.base.model.vo.FunctionTimeVo>'

平时使用 instanceof 都是 两个对象之间的类型比较,现在是要对象和集合进行类型比较不太懂


直接这样写 会出现编译异常


                if (range instanceof List<FunctionTimeVo>) {
                    result = (List<FunctionTimeVo>) range;    
                }
Illegal generic type for instanceof

这样写又没有检查到集合中的对象的类型,相当于没写

          if (range instanceof List<?>) {
                    result = (List<FunctionTimeVo>) range;    
                }

感觉这是一个比较基础的问题,平时没怎么用就不知道该怎么做,希望大佬们给解答一下

阅读 9.1k
2 个回答

因为类型擦除了,所以没法判断是不是 List<MyType>

可以弄一个可以记录类型信息的包装类型:

class GenericList<T> extends ArrayList<T> {
  private Class<T> genericType;

  public GenericList(Class<T> type) {
      this.genericType = type;
  }

  public Class<T> getGenericType() {
      return type;
  }
}

如果没有包装类型的话,一般是尝试取第一个元素,看它的类型,大概这样:

if (range instanceof List<?>) {
  List list = (List)range;    
  if (!list.isEmpty() && list.get(0) instanceof MyType){
    // TODO
  }
}

但如果你用反射之类的手段往里强插了一个别的类型,一样有类型安全问题。归根结底是类型擦除把类型信息弄没了。

P.S. 楼上那种做法跟你判断 List<?> 没有区别,只是去掉了编译器警告。

Java泛型是通过类型擦除来实现的,所以range instanceof List<FunctionTimeVo>这种形式是不合法的。
如果不想让编译器产生警告,在方法上加个注解@SuppressWarnings("unchecked")就可以了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题