Java RTTI 类型转换检查 常用若干方法辨析

RTTI含义:在运行时对所有的类型转换进行正确性检查。

(一)Class.cast( ) 向下转型,将传入的父类型向下强转为子类型。

// 前提:MyException2 extends MyException
// Class.cast(Object obj) 与 MyException2 cast=(MyException2)exception 相似
   
   MyException exception = new MyException2();
   Class<MyException2> class2=MyException2.class;
   MyException2 cast = class2.cast(exception);

       该cast()方法底层源码: 底层应用Class.isInstance( ).

/*
 * @since 1.5
 */ 
public T cast(Object obj) {
   if (obj != null && !isInstance(obj))
        throw new ClassCastException(cannotCastMsg(obj));
        return (T) obj;
    }
}

(二)Class.isInstance( ) :自身类.class.isInstance(自身类的实例或子类实例)

          动态的Instanceof,返回值为boolean,若是为true,否则为false。

public void f(Dog dog){
    Map<Class<? extends Dog>, Integer> map=new HashMap<>();
    for (Entry<Class<? extends Dog>, Integer> es : map.entrySet()) {
      //判断传入的参数是否为自身或其子类实例
      if (es.getKey().isInstance(dog)) {  //解决了多个instanceof表达式作if判断时的低效与乏味
	    map.put(es.getKey(), es.getValue()+1);
      }
    }
}

(三)instanceof : 自身实例或子类实例 instanceof 自身类

         判断A是否为B的实例,其中A为对象,B为类型。返回值为boolean,若是为true,否则为false。

Integer i = 2;  
System.out.println(i instanceof Integer);  //true
System.out.println(i instanceof Number);  //true
System.out.println(i instanceof Serializable); //true

(四)Class.isAssignableFrom( )方法 A.isAssignableFrom(B)

         判断A是否是B的父类 或者 和B类型相同 或者 B实现了A接口。是类或接口之间的比较。

System.out.println(Number.class.isAssignableFrom(Integer.class));  //true
System.out.println(Number.class.isAssignableFrom(Number.class));  //true
System.out.println(Serializable.class.isAssignableFrom(Number.class)); //true

猜你喜欢

转载自blog.csdn.net/qq_39028580/article/details/79499604