Pytanie co stanie się gdy będziemy chcieli skompilować i wykonać ten kod:

Listing 1.

package eu.runelord.blog;
public class App {
    public static void main( String[] args ){
       metoda(null);
    }
    public static void metoda(Object ... objects ){
    }
}

No właśnie… pojawi się „ciekawostka” na poziomie kompilatora. Zostanie wygenerowane ostrzeżenie:

Listing 2. Zrzut z konsoli kompilatora

[WARNING] d:\Blog\RzutNiczym\src\main\java\eu\runelord\blog\App.java:
[11,14] non-varargs call of varargs method with inexact argument type for last parameter;
cast to java.lang.Object for a varargs callcast to java.lang.Object[] 
for a non-varargs call and to suppress this warning

Pytanie dlaczego musimy wykonać rzutowanie skoro przekazujemy null? Poniższe dla programy pokazują dlaczego:

Listing 3. Przeciążona metoda bez rzutowania…

package eu.runelord.blog;
public class App {
    public static void main( String[] args ){
       metoda(null);
    }

    public static void metoda(Object objects ){
        System.out.println("object");
    }
    public static void metoda(Object ... objects ){
        System.out.println("objects");
    }
}

Listing 4. … i z rzutowaniem

package eu.runelord.blog;
public class App {
    public static void main( String[] args ){
       metoda((Object)null);
    }
    public static void metoda(Object objects ){
        System.out.println("object");
    }
    public static void metoda(Object ... objects ){
        System.out.println("objects");
    }
}

Rzutowanie po pierwsze wskazuje o którą metodę nam chodzi i po drugie pozwala na zachowanie pełnej kontroli nad kodem poprzez eliminację mechanizmów promowania i preferowania wyboru przeciążonych metod w trakcie kompilacji.

Dobranoc

ps. warto do konfiguracji pluginu kompilatora w mavenie dodać opcję showWarnings z wartością true. Wychodzą wtedy różne ciekawe kwiatki w kodzie.