Ja, die würde auch passen. Kommentiere eine der beiden genannten Methoden um und du wirst die verbliebenen zwei Methoden bekommen.Aber dann würde doch eigentlich auch die erste Methode passen. Weil ein "short" zu "long" gecastet werden kann und die beiden "ints" auch. Oder?
Zum Thema Type-Casting siehe auch Openbook, Kapitel 2.4.10gecastet
Also, du hast die SignaturDanke für die schnelle Antwort.
@KonradN
Aber dann würde doch eigentlich auch die erste Methode passen. Weil ein "short" zu "long" gecastet werden kann und die beiden "ints" auch. Oder?
@httpdigest
Könntest du diese Regel mit Beispielen erklären? Ich bin neu im Programmieren und mein Prof hat das heute erklärt, aber hab nichts verstanden und auch durch die ganzen Youtube-Beiträge. Niemand erklärt das.
short
/int
/int
, fuer long
/long
/long
sind das 3 Umwandlungen, fuer int
/long
/int
sind es 2 Umwandlungen und fuer short
/int
/double
sind es auch zwei Umwandlungen. Damit werden dir die letzten beiden Methoden angezeigt/vorgeschlagen weil diese am besten passen, und die long
/long
/long
Methode passt nicht so gut wie die anderen. Du koenntest auch die long
/long
/long
Methode mit deinen Parametern aufrufen, aber die anderen beiden Methoden brauchen weniger Umwandlungen und damit geht die IDE davon aus dass du eine von den beiden wolltest.public class test {
public static void max(long a, long b, long c) {
}
public static void max(int a, long b, int c) {
}
public static void max(short a, int b, double c) {
}
public static void main(String[] args) {
max((byte) 1, (byte) 1,1L);
}
}
long
kann zu double
erweitert werden. Abschnitt 5.1.2 von Conversions and Contexts listet die alle.max( (byte) 1, (byte) 1, 1L)
byte a = (byte) 1;
byte b = (byte) 1;
long c = 1L;
max(a, b, c);
max(long a, long b, long c) -> geht, weil byte zu long implizit erweitert werden kann
max(int a, long b, int c) -> geht nicht, weil long nicht zu int implizit erweitert werden kann
max(short a, int b, double c) -> geht, weil byte zu short, byte zu int und long zu double implizit erweitert werden kann
Erweiterung und Casting sind beides Umwandlungen. Casting bedeutet nur, dass die Umwandlung explizit unter Zuhilfenahme des Casting-Operators angegeben wird.
In der Zeile
hast Du zwei int-Literale und ein long-Literal stehen. Die beiden int-Literale castest Du auf byte. Du könntest den Code ersetzen durch:Code:max( (byte) 1, (byte) 1, 1L)
Der Compiler sieht jetzt: aha, zwei byte und ein long, welche Methoden stehen mir zur Verfügung, wenn nach 5.1.2 folgende Umwandlungen implizit erlaubt sind?Code:byte a = (byte) 1; byte b = (byte) 1; long c = 1L; max(a, b, c);
byte -> byte, short, int, long, float, or double
long -> long, float, double
Bewertung:
Code:max(long a, long b, long c) -> geht, weil byte zu long implizit erweitert werden kann max(int a, long b, int c) -> geht nicht, weil long nicht zu int implizit erweitert werden kann max(short a, int b, double c) -> geht, weil byte zu short, byte zu int und long zu double implizit erweitert werden kann
max(long a, long b, long c) -> geht, weil byte zu long implizit erweitert werden kann
max(int a, long b, int c) -> geht nicht, weil long nicht zu int implizit erweitert werden kann.
max(short a, int b, double c) -> geht, weil byte zu short, byte zu int und long zu double implizit erweitert werden kann
Ja, aber nur eine davon braucht eine Erweiterung/Umwandlung, naemlichWas ich mich dann aber frage ist, warum es zum Beispiel zu keinem Compilerfehler kommt, wenn man die Methode mit max(1,1,1) aufruft, weil hier hätte man auch drei Kandidaten.
int
/long
/int
, damit gewinnt diese Methode die Bewertung welcher am besten passt. Die mit short
faellt komplett raus (wein implizit von int
auf short
geht nicht) und long
/long
/long
braucht drei Erweiterungen/Umwandlungen.Zur ersten Frage: ganz genau. int ist keine Erweiterung von long, daher ist die Umwandlung nicht implizit möglich.Bei max(int a, long b, int c) wird doch aber nicht long nach int impliziert erweitert, sondern umgekehrt. Oder nicht ? Der erste Parameter wird von byte zu int impliziert erweitert. Der zweite Parameter wird von byte nach long erweitert und der letzte Parameter wird von int nach long erweitert oder?
Das ist mir beim drüber sehen doch tatsächlich entgangen, dass der Aufruf sich an der dritten Stelle nun verändert hat … so ein L ist doch schnell beim Lesen mal übersehen ….es ist ja ein long-Literal gegeben
Die Tabelle ist gut, aber deine Aussage ist meines Erachtens falsch.0=pass directly
1=implicit cast
-1=doesn't pass / explicit cast needed
Sobald einmal-1
vorkommt, wird diese Methode als möglicher Aufruf ausgeschlossen. Wenn es aber mehrere Methoden gibt, für die alle Argumente>= 0
gelten, wird nicht mehr zwischen "direct pass" und "implicit cast" unterschieden, sondern sie wird als "ambiguous" behandelt. Mehrere mögliche Methoden ("ambiguous") darf es für einen Aufruf nicht geben und ist in der Folge ein Compilierfehler zur Übersetzungszeit.
Ich denke, das erklärt die Frage.