2011-07-27 31 views
2

下面的代碼不編譯:問題的「的instanceof」包含通用外部類

class OuterClass<T> { 

    class BaseClass { } 

    class SubClass extends BaseClass { } 

    public void test(BaseClass myObject) { 
     boolean b = (myObject instanceof SubClass); 
    } 
} 

上方法test()的錯誤信息是:「無法執行的instanceof覈對參數化的類型MyOuterClass.MySubClass使用形式。 MySubClass替代,因爲進一步的泛型類型信息將在運行時被刪除「

那麼,如何確定變量是否BaseClass類型的?我已經嘗試了所有以下的,他們不工作:

boolean b1 = (myObject instanceof SubClass); 
boolean b2 = (myObject instanceof SubClass<T>); 
boolean b3 = (myObject instanceof SubClass<?>); 
boolean b4 = (myObject instanceof OuterClass.SubClass); 
boolean b5 = (myObject instanceof OuterClass<T>.SubClass); 
boolean b6 = (myObject instanceof OuterClass<?>.SubClass); 
boolean b7 = (myObject instanceof OuterClass.SubClass<T>); 
boolean b8 = (myObject instanceof OuterClass.SubClass<?>); 

我覺得這個問題是獨立的JVM版本,但爲了以防萬一,我使用Sun的版本1.6.0_22-B04。

+1

假設您擺脫了「我的」前綴,您的「b4」行應該有效。 – highlycaffeinated

+0

而不是測試類,爲什麼不測試一個接口?我認爲這應該可以解決你的問題。 – johnnieb

+0

謝謝您發現錯字,高度無咖啡因;我已刪除前綴「我的」。 –

回答

0

感謝高度缺乏咖啡因和Nulldevice指出,B4和B6是正確的。

我發現這是我使用的Eclipse版本中的一個錯誤。 (我使用的是Ganymede,當我升級到Helios時它被修復了。)

只是爲了記錄,我已經將它歸檔爲Eclipse bug 353354

2

這只是局部的答案,但如果我們修改該示例如下,它編譯:

class OuterClass<T> { 

    class InnerClass { } 

    public void test(Object myObject) { 
     boolean b1 = (myObject instanceof OuterClass.InnerClass);  // Works 
     boolean b2 = (myObject instanceof OuterClass<?>.InnerClass); // Also works 
    } 
} 
+0

好的,剩下的問題是什麼?你想知道爲什麼嗎*? –

1

您的B4代碼是正確的。至少在1.6.0_23。

class OuterClass<T> { 

    class BaseClass { } 

    class SubClass extends BaseClass { } 

    public void test(BaseClass myObject) { 
     boolean b = (myObject instanceof OuterClass.SubClass); 
     System.out.println(b); 
    } 

    public static void main(String[] args) { 
     OuterClass<Integer> outerClass = new OuterClass<Integer>(); 
     OuterClass<Integer>.BaseClass b = outerClass.new BaseClass(); 
     OuterClass<Integer>.SubClass s = outerClass.new SubClass(); 
     outerClass.test(b); 
     outerClass.test(s); 
    } 
} 

輸出:

false 
true 

Java版本:

java version "1.6.0_23" 
Java(TM) SE Runtime Environment (build 1.6.0_23-b05) 
Java HotSpot(TM) 64-Bit Server VM (build 19.0-b09, mixed mode) 
+0

這根本沒有回答任何問題 –

1

回憶痛苦的經歷追逐與名爲非靜態內部類微妙的錯誤,我只是無法抗拒看什麼發生如果我讓'靜態...

class OuterClass<T> { 

    static class BaseClass { } 

    static class SubClass extends BaseClass { } 

    public void test(BaseClass myObject) { 
     boolean b = (myObject instanceof SubClass); 
    } 
} 

...和瞧!編譯器錯誤已經隨之而來