Rzut niczym
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.