一、基本介绍
Java中有两种常用的类型比较方法:isAssignableFrom与instanceof,它们都可以用来判断一个Java对象是否是一个类或接口的实例。它们的共同点是都可以进行类型比较,但是它们的使用场景和一些区别也需要我们认真了解。
二、isAssignableFrom的使用
isAssignableFrom是Class类中的方法。isAssignableFrom方法的作用是判定是否为某个类的父类,即判断是否可以从参数类型转换到调用方法的类的类型。
public boolean isAssignableFrom(Class cls)
例如:
Object obj = new String(); Class clz = String.class; boolean bool1 = clz.isAssignableFrom(obj.getClass()); //true boolean bool2 = obj.getClass().isAssignableFrom(clz); //false
在这个例子中,我们可以看到Class String和Object之间的继承关系。由于String是Object的子类,所以String可以赋值给Object类型的变量。这也是为什么bool1返回true的原因。
bool2是false的原因是因为String不能被赋值给Class Object。String是Class String的一个实例,而Class Object是Class String的父类,所以bool2是false。
三、instanceof的使用
instanceof是java关键字,它用来判断一个对象是否是一个类的实例,或者是该类及其子类的实例。
Object obj = new String(); boolean bool1 = obj instanceof String; //true boolean bool2 = obj instanceof Object; //true boolean bool3 = obj instanceof Integer; //false
在这个例子中,我们可以看到obj是一个String的实例,所以bool1是true。由于String是Object的子类,而obj是String和Object的共同祖先Object的子类,所以bool2是true。由于obj不是一个Integer类型,所以bool3是false。
四、isAssignableFrom和instanceof的区别
虽然isAssignableFrom和instanceof都可以用来进行类型比较,但是它们的使用场景和实现方式是不同的。
1. 使用场景:
isAssignableFrom一般用来进行类型转换,判断一个类型是否可以转换成另外一个类型。
Class clazz = String.class; Object obj = clazz.newInstance(); if(clazz.isAssignableFrom(obj.getClass())){ String str = (String)obj; //转换成功 }
而instanceof一般用来判断一个类的实例是否为另外一个类或者接口的实例。
Object obj = new String(); if(obj instanceof String){ String str = (String)obj; //类型判断通过 }
2. 原理实现:
isAssignableFrom的实现方式:判断调用方是否是参数的父类或者实现的接口。
public boolean isAssignableFrom(Class cls) { return (cls != null) && (cls.isSubclassOf(this) || this == cls); }
instanceof的实现方式:使用Java虚拟机中的checkcast指令。
Object obj = new String(); if(obj instanceof String){ String str = (String)obj; } //上面的代码大致相当于 String str = (String)obj; //Java虚拟机在执行这行代码时会执行类似于下面这样的指令 if(!obj.getClass().isInstance(str)){ throw new ClassCastException(); }
五、总结
虽然isAssignableFrom和instanceof都是用于Java类型比较的,但是它们是有区别的。isAssignableFrom主要用于判断一个类是否是另外一个类或者接口的父类,而instanceof主要用于判断一个对象是否为一个类或者其子类的实例。需要根据具体情况选择合适的类型比较方法。