2016-04-30 54 views
0

在C++中函數重載的情況下,我們知道在實際和形式參數不匹配時可能會出現歧義。所以有一個解決這個問題的機制。函數在C++ V中重載的歧義Java

For every actual parameter P, Si be the set of corresponding formal parameters that matches best. then S will be the intersection of all Si. 

爲此,有4種類型的規則。

  1. 完全匹配
  2. 促進
  3. 標準轉換
  4. 用戶定義的轉換
  5. 省略號(由所有不考慮)

是否類似的過程中出現的Java呢?由於Java的情況下函數重載的規則是相同的,這些類型的歧義也可以在這裏發生。

+3

參見[JLS-8.4.9。超載(http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.9),其中包括以下內容,*當被調用的方法(§15.12 )中,使用的實際參數(和任何明確的類型參數)和編譯時間類型的參數的數量,在編譯時,確定將被調用的方法的簽名(§15.12.2)。如果要調用的方法是實例方法,則將使用動態方法查找(第15.12.4節)在運行時確定要調用的實際方法。* –

回答

3

相似的過程?那麼,取決於「相似」的含義。

但它確實在Java語言規範文件,
15.12 Method Invocation Expressions
,特別是分章15.12.2. Compile-Time Step 2: Determine Method Signature

確定適用性的過程首先確定可能適用的方法(§15.12.2.1)。

該過程的其餘部分分爲三個階段,以確保與Java SE 5.0之前的Java編程語言版本的兼容性。的階段是:

  1. 第一階段(§15.12.2.2),而不允許拳擊或取消裝箱轉換,或使用可變元數的方法調用的執行重載解析。如果在此階段沒有找到適用的方法,則處理繼續到第二階段。

  2. 第二階段(§15.12.2.3)執行重載解析,同時允許裝箱和取消裝箱,但仍排除使用變量方法調用。如果在此階段沒有找到適用的方法,則處理繼續到第三階段。

  3. 第三階段(§15.12.2.4)允許將重載與變量arity方法,裝箱和拆箱相結合。

決定方法是否適用在通用方法(§8.4.4)的情況下需要分析類型參數。類型參數可以顯式或隱式傳遞。如果它們是隱式傳遞的,則必須從參數表達式中推斷出類型參數的範圍(§18 (Type Inference))。

如果在適用性測試的三個階段中的一個階段已經確定了幾種適用的方法,則選擇最具體的方法,如第§15.12.2.5部分所述。

15.12.2.5 Choosing the Most Specific Method總結本身相當不錯:

Java編程語言使用的是選擇了最具體方法的規則。

非正式直覺是一種方法比另一種更具體的,如果通過第一種方法處理的任何調用可以被傳遞到另一個未經編譯時間錯誤。

當然,比這更復雜一些。