为什么parameter.getType()isInstance(HttpServletRequest.class)的回报是假的,但用 “==” 是真

问题描述:

Parameter[] ps = method.getParameters(); 

Map<String,Integer> map = new HashMap<String,Integer>(); 

for(int ij = 0;ij<ps.length;ij++){ 

    Parameter p = ps[ij]; 

    RequestParam rp = p.getAnnotation(RequestParam.class); 

    if(rp != null){ 

     //do something 

    }else { 
     System.out.println(p.getType()); 
     System.out.println(p.getType().isInstance(HttpServletRequest.class)); 
     System.out.println(p.getType() == HttpServletRequest.class); 
    } 
} 

输出为:为什么parameter.getType()isInstance(HttpServletRequest.class)的回报是假的,但用 “==” 是真

interface javax.servlet.http.HttpServletRequest 
false 
true 

为什么要用 “isInstance” 是假的并使用“==”是真的? 因为“实例”无法判断实现关系吗?

isInstance等于}这种

此方法是Java语言的instanceof 操作者的动态等效。

该方法返回false,因为你是比较一个类到另一个类HttpServletRequest.class采用这个方法(通过p.getType()返回)希望有一个实例,例如:

Dog bobby = new BobbyDog(); // class BobbyDog extends Dog 
System.out.println(Dog.class.isInstance(bobby)); // correct use (return true) 
System.out.println(Dog.class.isInstance(BobbyDog.class)); // incorrect use (return false) 

等于运算因为这两个类是相等的

p.getType() == HttpServletRequest.class // true 
HttpServletRequest.class == HttpServletRequest.class // true 

返回true,如果你想实现法官必须使用方法

关系
isAssignableFrom(Class<?> cls) 

确定是否此Class对象所表示的类 或接口或者是相同,或 是超类或超接口的,类或接口 由指定的类的参数来表示。如果是的话,它返回true; 否则返回false。如果此Class对象表示一个 基元类型,则此方法返回true,如果指定的类 参数恰好是此Class对象;否则返回false。

该类型不是HttpServletRequest类的实例,它是java.lang.Class的一个实例,其中包含有关HttpServletRequest类的信息。