Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Zasady

Przeładowywanie metod o zmiennej liczbie argumentów



 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Java
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
wowo098
Gość





PostWysłany: Czw Lis 03, 2016 5:58 pm  OP    Temat postu: Przeładowywanie metod o zmiennej liczbie argumentów Odpowiedz z cytatem Pisownia

Witam,
Wstawiłem dwie wersje kodu. Pierwsza kompiluje się i działa, natomiast druga nie kompiluje się. Nie mam pojęcia dlaczego. Byłby mi ktoś w stanie wyjaśnić skąd bierze się błąd w drugim kodzie? Różnica pomiędzy tymi kodami znajduje się tylko w typie jednego argumentu (char zmienione na Character). Niedziałający kod przy kompilacji wyrzuca błąd o następującej treści: "Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method f(float, Character[]) is ambiguous for the type StaticTest".

Kod pierwszy (działający):
Kod:
public class StaticTest
{
    static void f(float i, char... x)
    {
        System.out.println("1");
    }
    static void f(char... c)
    {
        System.out.println("2");
    }
    public static void main(String[] args)
    {
        f(1, 'a');
        f('a', 'b');
    }

}


Kod drugi (niedziałający):
Kod:
public class StaticTest
{
    static void f(float i, Character... x)
    {
        System.out.println("1");
    }
    static void f(Character... c)
    {
        System.out.println("2");
    }
    public static void main(String[] args)
    {
        f(1, 'a');
//-------- Problem pojawia sie przy wywolaniu ponizej------
        f('a', 'b');
    }

}
[/code]
Powrót do góry
marcin_an



Dołączył: 26 Maj 2005
Posty: 18813

PostWysłany: Czw Lis 03, 2016 9:43 pm      Temat postu: Odpowiedz z cytatem Pisownia

Dlatego, że próbowałeś stworzyć potworka i potworek cię ugryzł. Nie rób takich przeciążeń. Istnieje kilka typowych idiomów przy przeciążeniach (widzisz je w różnych bibliotekach) i trzymaj się ich, zgodnie z POLA. Nawet jeżeli czasami takie coś by przeszło kompilację, jak widać po pierwszym kodzie, to będzie potworek; zrozumienie jego działania będzie nadzwyczaj pracochłonne i tak naprawdę mało który użytkownik twojego kodu będzie wiedział, co tak naprawdę wywołuje.

Od strony technicznej sprawa wynika z sekcji 15.12 specyfikacji Javy, w szczególności 15.12.2.5. Przeraziła cię ta ściana tekstu? Prawidłowa reakcja. Właśnie dlatego takiego czegoś nie powinieneś tworzyć*. W skrócie: obydwie metody (tak w pierwszym, jak i drugim kodzie!) pasują do wywołania. W tej sytuacji kompilator musi ustalić, która jest najbardziej specyficzna. Kłopot w tym, że nie istnieje relacja porządku, która pozwalałaby porównać typy float i Character, a zatem nie da się ustalić, która jest najbardziej specyficzna. A skoro nie da się tego ustalić, to cały proces szlag trafia. Jedynie komunikat kompilatora jest niezbyt oczywisty dla osób, które nie znają specyfikacji języka, bo "na chłopski rozum" sugeruje co innego, niż tam naprawdę zachodzi.

W pierwszym kodzie "niechcący" działa dlatego, że konwersje między typami prostymi przebiegają inaczej niż przy autoboksingu.

____
* Dodam dla większego postraszenia: tutaj odgrywa dodatkową rolę cała sekcja dotycząca autoboksingu, oraz sekcja dotycząca niejawnego konwertowania liczb.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
wowo098
Gość





PostWysłany: Pią Lis 04, 2016 1:17 am  OP(?)    Temat postu: Odpowiedz z cytatem Pisownia

Dzięki za wyczerpującą odpowiedź!
Powrót do góry
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Java Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.02371 sekund, zapytan = 11
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |