Ich habe einen einfachen Code:
%Vor%Ich möchte wissen, warum
%Vor%ist möglich, aber
%Vor%unmöglich!
Wer kann das erklären?
Wer kann eine gemeinsame Regel für ähnliche Probleme festlegen?
Was Sie sehen, ist der Unterschied zwischen Methodenaufrufkonvertierung und Zuweisungskonvertierung.
Im Klartext ist Folgendes passiert: Die Konvertierungsregeln sind in beiden Fällen anders .
Fall 1: Umsetzungskonvertierung
%Vor%Wie Sie wissen, ist dies eine Zuweisungsanweisung. Wenn das Objekt, das zugewiesen wird, nicht genau dem erwarteten Typ entspricht, kann eine Konvertierung stattfinden, damit die Zuweisung trotzdem funktioniert.
Fall Nr. 2: Methodenaufrufkonvertierung
%Vor%Dies (die letzte Zeile) ist ein Methodenaufruf. Dies ist ein weiterer Ort, an dem das Typliteral möglicherweise nicht mit der Deklaration übereinstimmt. Daher gelten möglicherweise Konvertierungsregeln.
Also, warum sind sie anders?
Die Designer von Java haben verschiedene Konvertierungsregeln für diese beiden Fälle implementiert . In Fall Nr. 1 sind die Regeln (von der JLS):
... kann eine verengende primitive Konvertierung sein verwendet werden, wenn alle folgenden Bedingungen erfüllt sind:
- Der Ausdruck ist ein konstanter Ausdruck vom Typ byte, short, char oder int.
- Der Typ der Variablen ist byte, short oder char.
- Der Wert des Ausdrucks (der zur Kompilierzeit bekannt ist, da es sich um einen konstanten Ausdruck handelt) ist im Typ von darstellbar die Variable.
Also die int
- & gt; Die char
-Konvertierung in Fall # 1 wird speziell vom Java-Compiler überprüft und automatisch gelöst.
Die Regeln in Fall 2 unterscheiden sich jedoch. Hier wollten die Java-Entwickler die automatische Konvertierung, die sie für Zuweisungsanweisungen verwendeten, nicht implementieren. Von "Ein Programmierhandbuch zur Java-Zertifizierung: Eine umfassende Grundierung":
Beachten Sie, dass sich die Methodenaufrufe und Zuweisungskonvertierungen in einem unterscheiden Achtung: Methodenaufrufkonvertierungen enthalten nicht das Implizite Einschränkungskonvertierung für ganzzahlige konstante Ausdrücke.
Also, warum gibt es für die beiden Fälle unterschiedliche Regeln? Im Grunde genommen waren die Entwickler von Java der Meinung, dass die automatische Konvertierung nützlich und praktisch war, aber sie könnte die Dinge zu kompliziert machen, weil sie zu viel Schreibflexibilität haben. Sie dachten, Fall Nr. 1 sei eine einfache Situation, in der wir die Konvertierung durchführen können, ohne die Übersichtlichkeit zu verlieren, aber Fall Nr. 2 nicht. Hier ist die Begründung in der JLS:
Methodenaufrufkonvertierungen enthalten ausdrücklich nicht das implizite Einengung von Integer-Konstanten, die Teil einer Zuweisungsumwandlung ist. Die Designer der Java-Programmiersprache fühlten das inklusive Diese impliziten einschränkenden Konvertierungen würden zusätzliche Komplexität hinzufügen zu dem überladenen Methodenabgleich-Auflösungsprozess.
Und das ist insbesondere JLS 5.1, 5.2 und 5.3 .
BEARBEITEN
Im Hinblick auf die "zusätzliche Komplexität des überladenen Methodenvergleichs-Lösungsprozesses" gehe ich davon aus, dass sie versucht haben, diese Art von Situation zu vermeiden:
%Vor%Lesen Spezifikation ist richtig, aber es ist schwer für mich.
Ich biete weniger richtige, aber einfachere Antwort an:
wenn ich schreibe:
%Vor%voll analog:
%Vor%Es ist offensichtlich (es ist offensichtlich für mich) kompilieren Fehler
Ich hoffe es ist Hoffnungen jemand.