在Java中,如果比较null
,instanceof
运营商将只返回false
。如果测试不是所需类型的引用变量,则程序无法编译。 此运算符是否有效地仅测试参考是否为null
?还是有另一种用途,我没有想到?为什么不instanceof工作的方式听起来?
如果不是,为什么不叫它isNull
或更具描述性的东西?
在Java中,如果比较null
,instanceof
运营商将只返回false
。如果测试不是所需类型的引用变量,则程序无法编译。 此运算符是否有效地仅测试参考是否为null
?还是有另一种用途,我没有想到?为什么不instanceof工作的方式听起来?
如果不是,为什么不叫它isNull
或更具描述性的东西?
如果比较永不成立,则无法编译。例如:
"string" instanceof Number
这不会编译,因为编译器知道一个字符串永远不可能是一个数字。运算符完全按照人们所期望的方式执行:它测试操作数是否是指定类型的实例。
测试空引用时返回false会使代码更简单,更易读。它可以防止你需要做到这一点:
if (obj != null && obj instanceof Number) {
...
}
阅读,了解运营商:http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.20.2
我不确定您是如何得出结论的,但当第一个操作数的运行时类型与第二个操作数指定的类型不匹配时,instanceof
操作将导致false
。
例如,
Object t1 = "Hello, World!";
System.out.println(t1 instanceof Number);
…打印“false”,因为t1是String
,而不是Number
或它的一个子类。
你能否请你包含一个instanceof
操作失败的例子编译?最有可能的是,这是由于语法错误。
例如:
...是一个Integer而不是String或* String的子类*(这里有一点值得讨论,因为String是final的,但这适用于其他类)。 – NullUserException
我想象一下,OP正在讨论的编译错误是:'Integer t1 = new Integer(0); System.out.println(t1 instanceof String);'which(predictably)给你一个“不兼容的类型”错误。 – NullUserException
@NullUserException我重写了这个例子来说明一个更一般的情况。 – erickson
当你有一个超类型的参考,你要检查的对象是一些子类的实例是非常有用
public class Sup { }
public class Sub1 extends Sup { }
public class Sub2 extends Sup { }
public void someMethod(Sup sup) {
if(sup instanceof Sub1) {
//....
}
}
instanceof
返回true,当您使用它agains的类的实例在其右,或任何从它派生。否则返回false。
class A { /*...*/ }
class B extends A { /*...*/ }
A objA = new A();
B objB = new B();
boolean test = objA instanceof A; // test is true
test = objA instanceof B; // test is false
test = objB instanceof A; // test is true
test = objB instanceof B; // test is true
上面的代码不会引发任何异常。但是,以下将做:
objB = (B) objA;
希望这会有所帮助。
if(MyObj instanceof SomeClass)
请注意,在大多数情况下,可以通过多态来避免instanceof使用情况。
听起来你可能会错误地使用'instanceof'。你能发布无法编译的代码吗? –
您总是可以将您正在测试的引用转换为“对象”。那么它应该按照你期望的方式工作。我想它会给你一个编译错误的原因是,如果它在编译时知道类型,在运行时测试它是没有意义的。 – NullUserException
你可以发布你的代码吗?如果您收到编译错误,那么您可能没有正确使用它。 :P – Michael