Przeładowywanie metod o zmiennej ilości argumentów

0

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 pierszy (działający):

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):

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');
		f('a', 'b');
	}

}
1

W pierwszym przykładzie, oba wywołania funkcji f ściśle pasują do zdefiniowanych funkcji, a w drugim nie pasują - trzeba rzutować. A takie dwa rzutowania

(Character)`a` 
(float)`a`

są poprawne.

0
bogdans napisał(a):

W pierwszym przykładzie, oba wywołania funkcji f ściśle pasują do zdefiniowanych funkcji, a w drugim nie pasują - trzeba rzutować. A takie dwa rzutowania

(Character)`a` 
(float)`a`

są poprawne.

Dziękuję za odpowiedź. Tylko jeszcze jedno pytanko.
Czym się różni klasa Character od typu char, że 'a' na char nie trzeba rzutować, a 'a' na Character już trzeba? Bo chyba o to chodzi jeśli dobrze zrozumiałem Twoją odpowiedź.

1

Chyba źle mnie zrozumiałeś, w pierwszym przykładzie masz metodę o sygnaturze

static void f(char... c)

i wywołanie

f('a', 'b');

które dokładnie do tej sygnatury pasuje, kompilator nie ma zatem rozterek, której metody użyć. W drugim przykładzie, żadna sygnatura nie pasuje dokładnie, trzeba zatem rzutować, a poprawne składniowo są oba rzutowania, kompilator nie wie, które ma zastosować.

0

Już rozumiem :) Dzięki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1