2011-11-28 32 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使用情況。

相關問題