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.

5 myśli na temat “Rzut niczym

  1. sprawdz sobie wyglad tego posta w firefox 3 – widac tylko pierwsza linijke listingow kodow javowych..

  2. @corvax, poprawione. Cholerny blogger dodaje brki zamiast enterów i są tylko problemy.

Napisz odpowiedź

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax