eri*_*223 81 java class instanceof
为什么这段代码不能编译?
public boolean isOf(Class clazz, Object obj){
if(obj instanceof clazz){
return true;
}else{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
为什么我不能将类变量传递给instanceof?
Rob*_*anu 124
该instanceof操作符对引用类型,像Integer,而不是对象,如new Integer(213).你可能想要这样的东西
clazz.isInstance(obj)
Run Code Online (Sandbox Code Playgroud)
附注:如果你写的话你的代码会更简洁
public boolean isOf(Class clazz, Object obj){
return clazz.isInstance(obj)
}
Run Code Online (Sandbox Code Playgroud)
但是,不确定你是否需要一种方法.
Eya*_*der 12
instanceof只能用于显式类名(在编译时声明).要进行运行时检查,您应该:
clazz.isInstance(obj)
Run Code Online (Sandbox Code Playgroud)
这有一个小优势,clazz.isAssignableFrom(..)因为它obj == null更好地处理案件.
正如其他人所提到的,您不能将类变量传递给,instanceof因为类变量引用了Object的实例,而右侧的instanceof必须是type。也就是说,instanceof并不意味着“y 是对象 x 的实例”,而是“y 是类型 X 的实例”。如果您不知道对象和类型之间的区别,请考虑:
Object o = new Object();
在这里,类型是Object,并且o是对具有该类型的 Object 实例的引用。因此:
if(o instanceof Object)
是有效的,但是
if(o instanceof o)
不是因为o右手边是一个对象,而不是一个类型。
更具体到您的情况,类实例不是类型,它是一个对象(由 JVM 为您创建)。在您的方法中,Class是一种类型,但是clazz是一个对象(好吧,是对对象的引用)
您需要的是一种将对象与类对象进行比较的方法。事实证明,这是流行的,因此将其作为 Class Object: 的方法提供给您isInstance()。
这是 isInstance 的 Java Doc,它更好地解释了这一点:
public boolean isInstance(Object obj)确定指定的 Object 是否与由此类表示的对象赋值兼容。此方法是 Java 语言 instanceof 运算符的动态等效方法。如果指定的 Object 参数为非 null 并且可以强制转换为由此 Class 对象表示的引用类型而不引发 ClassCastException,则该方法返回 true。否则返回 false。
具体来说,如果此 Class 对象表示一个已声明的类,并且指定的 Object 参数是所表示的类(或其任何子类)的实例,则此方法返回 true;否则返回 false。如果这个 Class 对象表示一个数组类,如果指定的 Object 参数可以通过恒等转换或扩展引用转换转换为数组类的对象,则此方法返回 true;否则返回 false。如果此 Class 对象表示一个接口,则如果指定 Object 参数的类或任何超类实现此接口,则此方法返回 true;否则返回 false。如果此 Class 对象表示原始类型,则此方法返回 false。
参数: obj - 要检查的对象
返回:如果 obj 是此类的实例,则为 true
自: JDK1.1
| 归档时间: |
|
| 查看次数: |
28712 次 |
| 最近记录: |