我记得在一些Java书中读到除了'instanceof'之外的任何运算符,用于比较两个对象之间的类型层次结构。
instanceof是最常用和最常见的。我无法清楚地记得是否确实存在其他方式。
答案 0 :(得分:6)
您也可以使用Class.isInstance
进行反思。
Class<?> stringClass = Class.forName("java.lang.String");
assert stringClass.isInstance("Some string");
显然,如果在编译时知道类的类型,那么instanceof
仍然是最佳选择。
答案 1 :(得分:6)
是的,有。不是运算符而是Class类的方法。
来自doc:
的引用...此方法是Java语言instanceof operator
的动态等价物
public class Some {
public static void main( String [] args ) {
if ( Some.class.isInstance( new SubClass() ) ) {
System.out.println( "ieap" );
} else {
System.out.println( "noup" );
}
}
}
class SubClass extends Some{}
答案 2 :(得分:3)
操作实例是最佳选择,原因有两个: 1)它处理子类型,所以如果你有一个子类/子类型的实例,你仍然会得到真实。 2)它处理null,因此null instanceof Class将返回false
如果你拿一个对象的类然后与另一个类进行比较,那么你冒着冒一个空对象的类的风险,你不能直接得到子类型。
如果使用表示类的对象,则可以使用反射操作,因为instanceof将引用它们自己的类Class,而不是它们所代表的类。
答案 3 :(得分:1)
if ( someClass.isAssignableFrom( obj.getClass() ) )
相当于
if ( obj instanceof Foo )
如果在编译时已知要检查的类,则使用instanceof
,如果仅在运行时知道,则使用isAssignableFrom
。