---
# System prepended metadata

title: 方法之四 - 多載
tags: [java, article index, tutorial article, teaching]

---


本篇說明會著重在於多載(overloading)上 。

當同樣方法名稱，卻有著不同傳入參數形態、數量的時候，
此時同樣名稱的方法就可以同時存在，即便一個是傳入基本形態，
而另一個是傳入包裹基本形態的物件(wrapper object)。

但程式選擇傳入的方法，還是有先後順序的分別。
Match -> Promotion -> Auto Boxing -> Var-args

```java
public class ExampleMethod3 {

    public static void main(String[] args) {

        /*
         * 依照這樣的順序，一個一個標注起來後，可以發現順序是
         * int > long > Integer > int array
         * 
         * 如果只剩下 Long 的話會錯誤，因為 int 無法提升成 Long 的形態。
         */
        test(1);
        
        /*
         * 對於這個例子來說，
         * 當呼叫 test 方法並傳入一個 List 物件，
         * 且該物件承載的是 String 元素時，這個方法是可以正確執行的。
         * 
         * 然而，如果將第二個 test 方法的註解移除，使其生效，
         * 就會發現這個程式碼將會出現錯誤。
         * 儘管第二個方法的參數型別是 List<Integer>，
         * 與第一個方法的參數型別 List<String> 不同，
         * 但在方法本身的角度來看，它們都只是接收一個 List 物件作為參數，
         * 而不關心該 List 物件所承載的元素類型。
         * 
         * 至於要怎麼做才可以讓同一個方法，可以同時接受不同承載物件的內容，
         * 那就是之後才會說到的內容了。
         */ 
        test(new ArrayList<String>());
    }

    //match
    public static void test(int i) {
        System.out.println("int");
    }

    //auto boxing
    public static void test(Integer i) {
        System.out.println("Integer");
    }
    
    //promotion
    public static void test(long i) {
        System.out.println("long");
    }
    
    //error
    public static void test(Long i) {
        System.out.println("Long");
    }
    
    //var-args
    public static void test(int...i) {
        System.out.println("int array");
    }
    
    //這個 method 的 List 承載的是 String
    public static void test(List<String> list) {}
    
    //這個 method 的 List 承載的是 Integer
    //public static void test(List<Integer> list) {}

}
```