重載方法選擇:實數與宣告的參數類型
在Java 程式設計中,重載方法提供了使用相同的方法定義多個方法的靈活性名稱但參數清單不同。呼叫方法時,編譯器會根據提供的參數清單決定要呼叫的適當方法。
但是,在某些情況下,您可能想知道方法選擇是否考慮參數的實際(運行時)類型所聲明的類型。考慮以下程式碼:
interface Callee { void foo(Object o); void foo(String s); void foo(Integer i); } class CalleeImpl implements Callee { @Override public void foo(Object o) { System.out.println("foo(Object o)"); } @Override public void foo(String s) { System.out.println("foo(\"" + s + "\")"); } @Override public void foo(Integer i) { System.out.println("foo(" + i + ")"); } } public class Main { public static void main(String[] args) { Callee callee = new CalleeImpl(); Object i = new Integer(12); Object s = "foobar"; Object o = new Object(); callee.foo(i); callee.foo(s); callee.foo(o); } }
出乎意料的是,此程式碼為所有三個呼叫列印「foo(Object o)」。與直覺相反,方法選擇沒有考慮實際參數類型(整數、字串和物件)。相反,它僅依賴 Callee 介面中聲明的參數類型。
此行為源自於Java 語言規範,其中明確指出:
When a method is invoked, the number of actual arguments and the compile-time types of the arguments are used, at compile time, to determine the signature of the method that will be invoked.
因此,需要注意的是在Java中,動態方法調度,即在運行時根據調用的對象確定實際呼叫的方法,僅適用於物件本身,不適用於參數類型。
以上是Java 方法重載是否考慮執行時間參數類型或僅考慮編譯時宣告的型別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!