2017-08-11 57 views
-6

爲什麼具有上限的通用通配符函數在有可能將子類作爲參數輸入時不允許訪問子類的成員?Java通用通配符函數

+0

這是不可能回答這樣一個普遍的問題。請分享一些代碼,並突出顯示您所遇到的問題。 – Mureinik

+1

閱讀此答案:https://stackoverflow.com/a/2723538/342852 –

+0

歡迎來到堆棧溢出!歡迎來到Stack Overflow!尋求調試幫助的問題(「爲什麼這個代碼不工作?」)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。沒有明確問題陳述的問題對其他讀者無益。請參閱:如何創建[mcve]。使用「編輯」鏈接來改善你的*問題* - 不要通過評論添加更多信息。謝謝! – GhostCat

回答

1
class Super{ 
    void superMethod(){} 
} 
class Sub extends Super{ 
    void subMethod(){} 
} 
class Sub2 extends Super{ 
    void subMethod2(){} 
} 

static <T extends Super> void processSuper(T input){ 
    // this is safe and compiles 
    input.superMethod(); 

    // this doesn't compile 
    input.subMethod(); 

    // nor this 
    input.subMethod2(); 
} 

看看上面的代碼片段。當我們使用extends Bound時,我們不知道實際的類型是什麼。編譯器不知道任何給定類型的子類型,所以他無法找出該方法是什麼。即使他這樣做了,那麼這實際上意味着使這種方法對任何其他子類型都不可用。

你當然可以用instanceof檢查做到這一點:

if(input instanceof Sub){ 
    ((Sub) input).subMethod(); 
} 

這編譯,但它被認爲是非常不好的風格(緊耦合)。 更好的OO設計將使superMethod()代表具有SubSub2的不同功能。


TL; DR 你想就無法實現,因爲編譯器不知道什麼亞型。即使它確實有效,它也會是可怕的OO Design。