목차

Java 메소드 오버라이딩과 가변인자

🗓️

가변인자’만’ 있는 시그니처

class Math {
    long add(int... args) {
        //...
    }
}

class MathTest {
    public static void main(String[] args) {
        Math math = new Math();

        math.add(new int[]{1,2}); // Okay
        math.add(); // Okay
    }
}

가변인자’도’ 있는 시그니처

class Math {
    long add(long start, long end, int... args) {
        //...
    }
}

class MathTest {
    public static void main(String[] args) {
        Math math = new Math();

        math.add(1L, 2L, new int[]{1,2}); // Okay
        math.add(1L, 2L, null); // Okay    
        math.add(1L, 2L); // Okay    
    }
}

오버로딩 되고 가변인자를 가지는 시그니처

다른 타입의 파라미터 일 때..

class Math {
    long add(String... args) {
        //...
    }

    long add(long start, long end, long... args) {
        //...
    }
}

class MathTest {
    public static void main(String[] args) {
        Math math = new Math();

        math.add(new String[]{"1","2"}); // Okay
        math.add(1L, 2L, null); // Okay    
        math.add(1L, 2L); // Okay    
    }
}

같은 타입의 파라미터 일 때..

class Math {
    long add(long... args) {
        //...
    }

    long add(long start, long end, long... args) {
        //...
    }
}

class MathTest {
    public static void main(String[] args) {
        Math math = new Math();

        math.add(1L, 2L, new long[]{1,2}); // Okay
        math.add(1L, 2L, null); // Okay    
        math.add(1L, 2L); // << !!! Ambiguous method call. Both    
    }
}