2013-06-23 83 views
1

在這裏,我有一點好奇:instanceof運算符與嵌套類

if (!(Outer instanceof Outer.Nested)) 
{ 
    System.out.println("IT IS NOT THE SAME!!"); 
} 

爲什麼編譯器不明白,Outer.Nested沒有延伸Outer也不可能是它的一個實例,因此給回一個編譯錯誤?

請注意,如果這是其他方式:Outer.Nested instanceof Outer它不會工作。

+0

是'Outer'和'Outer.Nested'兩個類嗎? – LaurentG

+2

請顯示'Outer'類 – Mik378

回答

1

首先,這種說法無法編譯,如果Outer是一個類類型:

if (!(Outer instanceof Outer.Nested)) // Outer is not an expression: Expression expected 

沒有在這個問題沒有一種高精度背景下,我想你會處理這樣的場景:

public class Outer { 

     private class Inner { 
     } 

     public static void main(String[] args) { 
      Test t = new Test(); 
      Inner i = t.new Inner(); 
      System.out.println(i instanceof Test); //inconvertible types => normal 
      System.out.println(t instanceof Inner); // inconvertible types => normal 
     } 

    } 

這一切都正常發生。

如果您的場景是類似的:聽起來像是您的編譯器進程的問題。

如果您的情況不相似:請更新您的問題並提供更多信息。

1

JLS 15.20.2

RelationalExpression: 
    .... 
    RelationalExpression instanceof ReferenceType 

類型instanceof運算符的操作數RelationalExpression必須是引用類型或null類型的;否則,會發生編譯時錯誤。

換句話說,instanceof的左側必須是對某個對象的引用或nullOuter看起來像一個類名,它既不是那些東西。

您可能正在尋找Class.isAssignableFrom(),它告訴您一個類是否是另一個類的超類。