给定 aClass<?> superType
和 a Object subInstance
,它们之间有什么区别
superType.isInstance(subInstance)
和
superType.isAssignableFrom(subInstance.getClass())
(如果有的话)?
在场景中,没有区别。
两种方法的区别在于参数。一种适用于对象,一种适用于类:
确定指定的 Object 是否与该 Class 表示的对象赋值兼容。
确定此 Class 对象表示的类或接口是否与指定的 Class 参数表示的类或接口相同,或者是其超类或超接口。
isAssignableFrom
还测试是否可以通过标识转换或通过扩大引用转换来转换类型。
Class<?> cInt = Integer.TYPE;
Long l = new Long(123);
System.out.println(cInt.isInstance(l)); // false
System.out.println(cInt.isAssignableFrom(cInt)); // true
isAssignableFrom()
只要类对象表示的类是subInstance.getClass()
isInstance()
只要对象subInstance
是superType
.
所以基本的区别是isInstance
与实例isAssignableFrom
一起工作与类一起工作。
isAssignableFrom
如果我没有实例/出于某种原因不想实例化类,我经常使用。否则,您可以同时使用两者。
从Java API:
isInstance(Object obj)
Determines if the specified Object is assignment-compatible with the object represented by this Class.
isAssignableFrom(Class<?> cls)
Determines if the class or interface represented by this Class object is either the same as, or is a superclass or superinterface of, the class or interface represented by the specified Class parameter.
所以听起来这两种方法做的事情非常相似,但是一种方法接受 aObject
并查看Class
该对象的 ,而另一种方法接受 a Class
。