Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么可以';";“类”;变量是否要传递给instanceof?_Java_Class_Instanceof - Fatal编程技术网

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)
,因为已经提供了对象。这没有错。也许很笨拙,但完全没问题。在可预见的将来,在返回之前,您可能需要其他代码。。。