为什么parameter.getType()。isInstance(HttpServletRequest.class)返回false,但使用" =="是真的

时间:2016-06-10 10:19:20

标签: java instanceof

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);
    }
}

输出是:

interface javax.servlet.http.HttpServletRequest
false
true

为什么要使用&#34; isInstance&#34;是假的,使用&#34; ==&#34;是真的? 因为&#34;&#34;的实例不能判断实施关系吗?

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:5)

isInstance等于instanceOf

  

此方法是Java语言instanceof的动态等价物   操作

该方法返回false,因为您正在将一个类(由p.getType()返回)与另一个类HttpServletRequest.class进行比较,而该方法需要一个实例,例如:

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)

equals运算符返回true,因为两个类是相等的

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

如果你想要判断实现关系,你必须使用方法

isAssignableFrom(Class<?> cls) 
  

确定是否上课   或此Class对象表示的接口或者相同,   或者是类或接口的超类或超接口   由指定的Class参数表示。如果是这样,它返回true;   否则返回false。如果这个Class对象代表一个   原始类型,如果指定的Class,此方法返回true   参数恰好是这个Class对象;否则返回false。