2010-04-07 109 views

回答

111

instanceof运算符适用于参考类型,如Integer,而不是对象,如new Integer(213)。你可能想是这样

clazz.isInstance(obj) 

附注:如果你写

public boolean isOf(Class clazz, Object obj){ 
    return clazz.isInstance(obj) 
} 

不能确定,如果你需要一个方法了,虽然你的代码会更简洁。

+0

我知道代码是完全无用,我只是想表明我的困惑:) – eric2323223 2010-04-07 07:37:10

+6

'整数'是**不是**类的文字。 'Integer.class'应该是一个类文字(参见JLS的§15.8.2:http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.8.2)。 'instanceof'运算符接受JLS的第15.20.2节中的“ReferenceType”(又名类型名称):http://java.sun.com/docs/books/jls/third_edition/html/expressions.html# 15.20.2 – 2010-04-07 08:03:31

+2

我会使用'clazz.isInstance(obj)',因为对象已经提供了。 – 2010-04-07 08:09:21

12

instanceof只能用于明确的类名(在编译时声明)。为了做一个运行检查,你应该做的:

clazz.isInstance(obj) 

这个拥有超过clazz.isAssignableFrom(..)小的优势,因为它用的情况下obj == null更好的交易。

3

首先,instanceof要求右边的操作数是一个实际的类(例如​​或obj instanceof Integer),而不是Class类型的变量。其次,你已经取得了相当普遍的新手的错误,你真的不应该做的......以下模式:

 
if (conditional_expression){ 
    return true; 
} else{ 
    return false; 
} 

以上可重构为:

 
return conditional_expression; 

你应该总是执行重构,因为它消除了冗余if ... else语句。类似地,表达式return conditional_expression ? true : false;可重构为相同的结果。

+2

这没有错。也许笨拙,但总体还可以。也许你在可预见的将来返回之前需要额外的代码... – 2017-06-13 09:59:11

2

正如其他人所说,你不能在一个类变量传递给instanceof因为类变量引用的对象的实例,而instanceof右手已经是一个。也就是说,instanceof并不意味着“y是对象x的实例”,它表示“y是类型X的实例”。如果你不知道对象和类型之间的区别,可以考虑:

Object o = new Object();

这里,类型为Object,并o是与该类型对象的实例的引用。因此:

if(o instanceof Object)

是有效的但

if(o instanceof o)

不是因为o在右手侧是一个对象,而不是一个类型。

更具体到你的情况,一个类的实例是不是一个类型,它是一个对象(这是由JVM为您创建)。在你的方法中,Class是一种类型,但是clazz是一个对象(以及对象的引用)

你需要的是一种将对象与类对象进行比较的方法。事实证明,这是流行的,所以这是作为类对象的方法提供给你的:isInstance()

这里是Java说明文件isInstance,这也解释了这更好:

public boolean isInstance(Object obj)

确定指定的对象是赋值兼容与此Class所表示的 对象。此方法是Java语言instanceof运算符的动态等效项。如果指定的Object参数非空并且可以将 转换为由此Class对象表示的引用类型而不引起 引发ClassCastException,则方法 返回true。否则返回false。

具体地,如果该Class对象表示一个声明的类,这 方法如果指定的Object参数是表示类的 实例,则返回真(或其任何亚类);否则返回错误 。如果此Class对象表示一个数组类,则此方法 将返回true,如果指定的Object参数可通过标识转换或扩展 参考转换转换为数组类的 对象;否则返回false。如果此Class对象 表示一个接口,则此方法在指定Object参数的类或任何超类实现此接口时返回true; 否则返回false。如果此Class对象表示一个 基元类型,则此方法返回false。

参数: OBJ - 对象检查
返回:如果真obj是这个类的一个实例
由于: JDK1.1