Java反射使用isAssignableFrom判断方法返回值是否为List类型异常问题
问题原因解释
核心误区:isAssignableFrom的调用顺序搞反了
Class.isAssignableFrom(Class<?> cls)的定义是:判断cls 类型的实例是否可以赋值给当前Class对象代表的类型的引用。简单来说:
- 写法
A.isAssignableFrom(B)等价于判断 A是不是B的父类/父接口,或者A和B是同一类型 - 你业务需要判断的是「方法返回类型是不是List类型/List的子类型」,所以正确的写法应该是
List.class.isAssignableFrom(returnType),而不是反过来写。
两个分支都触发的具体原因:
- 第一个方法
objectReturnType的返回类型是Object.class
你写的判断是Object.class.isAssignableFrom(List.class),因为所有Java类都继承自Object,List本身就是Object的子类,所以这个判断结果为true,触发了第一个分支。 - 第二个方法
listReturnType的返回类型是List.class
你写的判断是List.class.isAssignableFrom(List.class),同一类型判断结果自然为true,所以第二个分支也触发了。
正确实现方案
根据你的业务需求选择对应实现:
- 如果你要严格判断返回类型就是
List本身(不包含子类实现):if (returnType.equals(List.class)) { System.out.println("Yes it is."); } - 如果你要判断返回类型是
List或者它的实现类(比如ArrayList、LinkedList等都算匹配):if (List.class.isAssignableFrom(returnType)) { System.out.println("Yes it is."); }
额外注意点
如果你的业务还需要校验List的泛型参数(比如要判断返回的是List<String>而不是List<Integer>),那么不能用getReturnType(),它拿到的是泛型擦除后的类型,你需要调用Method.getGenericReturnType()获取泛型类型信息再做解析。
内容的提问来源于stack exchange,提问作者Suganthan Madhavan Pillai
相关产品推荐
相关产品推荐

