Java 为什么可以';";“类”;变量是否要传递给instanceof?
为什么这段代码不编译Java 为什么可以';";“类”;变量是否要传递给instanceof?,java,class,instanceof,Java,Class,Instanceof,为什么这段代码不编译 public boolean isOf(Class clazz, Object obj){ if(obj instanceof clazz){ return true; }else{ return false; } } 为什么我不能将类变量传递给instanceof?操作符对引用类型(如Integer)有效,而对对象(如newinteger(213))无效。你可
public boolean isOf(Class clazz, Object obj){
if(obj instanceof clazz){
return true;
}else{
return false;
}
}
为什么我不能将类变量传递给
instanceof
?操作符对引用类型(如Integer
)有效,而对对象(如newinteger(213)
)无效。你可能想要像这样的东西
clazz.isInstance(obj)
旁注:如果您编写
public boolean isOf(Class clazz, Object obj){
return clazz.isInstance(obj)
}
但是,不确定是否还需要方法。
instanceof
只能与显式类名一起使用(在编译时声明)。要执行运行时检查,您应该执行以下操作:
clazz.isInstance(obj)
与
clazz相比,它有一个小优势。isAssignableFrom(..)
因为它更好地处理了obj==null
的情况。首先,instanceof
要求右侧的操作数是一个实际的类(例如obj instanceof Object
或obj instanceof Integer
)并且不是类
类型的变量。其次,你犯了一个相当常见的新手错误,你真的不应该这样做。。。以下模式:
if ( conditional_expression ){
return true;
} else{
return false;
}
if(条件_表达式){
返回true;
}否则{
返回false;
}
上述内容可以重构为:
return conditional_expression;
返回条件表达式;
您应该始终执行重构,因为它消除了冗余的if…else语句。类似地,表达式
返回条件表达式?真:假代码>可以重构为相同的结果。正如其他人所提到的,您不能将类变量传递给instanceof
,因为类变量引用对象的实例,而instanceof
的右手必须是类型。也就是说,instanceof
并不意味着“y是对象x的实例”,而是意味着“y是类型x的实例”。如果您不知道对象和类型之间的区别,请考虑:
objecto=newobject()代码>
这里,类型是Object
,而o
是对该类型对象实例的引用。因此:
if(对象的实例)
有效,但
if(o实例of o)
不是因为右侧的o
是对象,而不是类型
更具体地说,类实例不是类型,而是对象(由JVM为您创建)。在您的方法中,Class
是一个类型,而clazz
是一个对象(嗯,是对对象的引用)
您需要的是一种将对象与类对象进行比较的方法。事实证明,这很流行,所以它作为类对象的方法提供给您:isInstance()
以下是iInstance的Java文档,它更好地解释了这一点:
公共布尔值isInstance(对象obj)
确定指定对象是否与指定对象兼容
由此类表示的对象。这种方法是动态的
与Java语言instanceof运算符等效。方法
如果指定的对象参数为非null且可以为空,则返回true
转换为此类对象表示的引用类型,而不使用
提出一个ClassCastException。否则返回false
具体地说,如果这个类对象表示一个声明的类,那么
如果指定的对象参数是的实例,则方法返回true
所代表的类别(或其任何子类别);它返回false
否则。如果此Class对象表示数组类,则此方法
如果指定的对象参数可以转换为
通过标识转换或加宽来创建数组类的对象
参考转换;否则返回false。如果该类对象
表示接口,如果类或任何
指定对象参数的超类实现此接口;
否则返回false。如果该类对象表示
基元类型,此方法返回false
参数:obj-要检查的对象
返回:如果obj是此类的实例,则返回true
自:JDK1.1
我知道代码完全没有用,我只想说明我的困惑:)Integer
不是类文字<代码>整数。类
将是类文字(见JLS:§15.8.2)。instanceof
操作符采用JLS第15.20.2节规定的“ReferenceType”(又称类型名):我会使用clazz.isInstance(obj)
,因为已经提供了对象。这没有错。也许很笨拙,但完全没问题。在可预见的将来,在返回之前,您可能需要其他代码。。。