2011-11-28 35 views
2

在Java中,如果比较nullinstanceof运营商将只返回false。如果测试不是所需类型的引用变量,则程序无法编译。 此运算符是否有效地仅测试参考是否为null?还是有另一种用途,我没有想到?为什么不instanceof工作的方式听起来?

如果不是,为什么不叫它isNull或更具描述性的东西?

+6

听起来你可能会错误地使用'instanceof'。你能发布无法编译的代码吗? –

+0

您总是可以将您正在测试的引用转换为“对象”。那么它应该按照你期望的方式工作。我想它会给你一个编译错误的原因是,如果它在编译时知道类型,在运行时测试它是没有意义的。 – NullUserException

+0

你可以发布你的代码吗?如果您收到编译错误,那么您可能没有正确使用它。 :P – Michael

回答

4

如果比较永不成立,则无法编译。例如:

"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

5

我不确定您是如何得出结论的,但当第一个操作数的运行时类型与第二个操作数指定的类型不匹配时,instanceof操作将导致false

例如,

Object t1 = "Hello, World!"; 
System.out.println(t1 instanceof Number); 

…打印“false”,因为t1是String,而不是Number或它的一个子类。

你能否请你包含一个instanceof操作失败的例子编译?最有可能的是,这是由于语法错误。

例如:

+1

...是一个Integer而不是String或* String的子类*(这里有一点值得讨论,因为String是final的,但这适用于其他类)。 – NullUserException

+0

我想象一下,OP正在讨论的编译错误是:'Integer t1 = new Integer(0); System.out.println(t1 instanceof String);'which(predictably)给你一个“不兼容的类型”错误。 – NullUserException

+0

@NullUserException我重写了这个例子来说明一个更一般的情况。 – erickson

1

当你有一个超类型的参考,你要检查的对象是一些子类的实例是非常有用

public class Sup { } 

public class Sub1 extends Sup { } 

public class Sub2 extends Sup { } 

public void someMethod(Sup sup) { 
    if(sup instanceof Sub1) { 
     //.... 
    } 
} 
1

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; 

希望这会有所帮助。

0
if(MyObj instanceof SomeClass) 
  • 如果左侧客体是空=返回false
  • 如果左侧不是右侧类的实例然后返回假
  • 如果左侧是实例如果右侧然后返回true

请注意,在大多数情况下,可以通过多态来避免instanceof使用情况。

相关问题