The Java Language Specification, section 8.4.2 schreibt:
Es ist ein Fehler Übersetzungszeit zwei Methoden mit Überschreibung äquivalenten Signaturen (unten definiert) in einer Klasse zu erklären.
Zwei Methodensignaturen m1 und m2 sind override-äquivalent, wenn entweder m1 eine Untersignatur von m2 oder m2 eine Untersignatur von m1 ist.
Die Signatur eines Verfahrens M1 ist ein Untersignatur der Signatur einer Methode m2, wenn entweder
Verständlich sind die Verfahren nicht äquivalent zu überschreiben, da ArrayList<String>
nicht ArrayList
ist (die Löschung von ArrayList<Integer>
).
Also die Methoden zu deklarieren ist legal. Außerdem ist der Methodenaufrufausdruck gültig, da dort eine spezifischste Methode trivial ist, da es nur eine Methode gibt, die den Argumenttypen entspricht.
Bearbeiten: Yishai weist richtig darauf hin, dass in diesem Fall eine andere Einschränkung eng umgangen wird. Die Java Language Specification, section 8.4.8.3 schreibt:
Es ist ein Kompilierung Fehler ist, wenn eine Typdeklaration T ein Element Methode m1 und es existiert ein Verfahren m2 erklärte in T oder einen übergeordneten Typen von T, so hat, dass alle der folgenden Bedingungen halten:
- m1 und m2 haben den gleichen Namen.
- m2 ist zugänglich von T.
- Die Unterschrift von m1 ist keine Unterschrift (§8.4.2) der Unterschrift von m2.
- m1 oder eine Methode m1 überschreibt (direkt oder indirekt) das gleiche Löschen wie m2 oder einige Methoden m2-Überschreibungen (direkt oder indirekt).
Anhang: Auf ersure, und das Fehlen davon
Entgegen der weit verbreiteten Vorstellung, Generika in Methodensignaturen werden nicht gelöscht. Generics werden in Bytecode (der Befehlssatz der Java Virtual Machine) gelöscht. Methodensignaturen sind nicht Teil des Anweisungssatzes; Sie werden wie im Quellcode angegeben in die Klassendatei geschrieben. (Nebenbei kann diese Information auch zur Laufzeit durch Reflexion abgefragt werden).
Denken Sie daran: Wenn die Typ-Parameter von Klassendateien gelöscht wurden vollständig, wie könnte die Code-Vervollständigung in der IDE Ihrer Wahl Anzeige, dass ArrayList.add(E)
einen Parameter vom Typ nimmt E
und nicht Object
(= die Löschung von E
), wenn Sie hatten den JDKs-Quellcode nicht angehängt? Und wie würde der Compiler wissen, einen Kompilierungsfehler zu werfen, wenn der statische Typ des Methodenarguments kein Untertyp von E
war?
Wenn dies ein tatsächlicher Anwendungsfall ist, würde ich nur eine Methode empfehlen 'public A getFirst (ArrayList ss) {return ss.get (0); } '... wenn es nur zu Illustrationszwecken erfunden wurde, mach weiter –
Was ist der Kompilierungsfehler in Eclipse? – meriton
Können Sie die Artikel zitieren? – trashgod