Vor kurzem wollte ich die Flexibilität von console.log in Java wiederherstellen, also habe ich beschlossen, eine generische Druckfunktion zu schreiben, die mehrere Argumente akzeptieren und diese durch Kommas getrennt ausgeben kann, genau wie console.log in JavaScript oder TypeScript. Das Ergebnis? Mir blieben mehr Fragen als Antworten übrig. Lassen Sie mich es Ihnen erklären.
Ich habe damit begonnen, eine einfache generische Funktion in Java zu schreiben, die Varargs vom Typ T akzeptiert und diese ausgibt, wobei die Werte durch Kommas getrennt werden:
public class Main { public static void main(String[] args) { Main.print(1, "4", new ArrayList<>()); // Expected type issues, but it ran without any problem! } private static <T> void print(T... args) { System.out.println(Arrays.toString(args)); } }
Ich hatte erwartet, dass Javas strikte Typisierung mich warnen oder einen Fehler auslösen würde, wenn ich gemischte Typen – Integer, String und ArrayList – übergebe, aber das war nicht der Fall. Der Code wurde kompiliert und lief einwandfrei und druckte [1, 4, []] ohne Beanstandungen.
Das hat mich erstaunt, denn als jemand, der auch mit TypeScript arbeitet, kam mir das komisch vor. Sollte Java diese Typinkonsistenz nicht abfangen?
Natürlich habe ich mich an TypeScript gewandt, um zu sehen, wie es damit umgehen würde. Ich habe eine ähnliche Funktion in TypeScript geschrieben:
function print<T>(...args: T[]) { console.log(args.join(",")); } print(1, "4", []); // TS warns (which makes sense): // Argument of type 'string' is not assignable to parameter of type 'number'.
Wie erwartet hat TypeScript eine Warnung ausgegeben! Da TypeScript den Typ T als Zahl aus dem ersten Argument (1) abgeleitet hat, hat es das zweite und dritte Argument („4“ und []) als ungültig gekennzeichnet. Dieses Verhalten war absolut sinnvoll, da TypeScript konsistente Typen für generische Funktionen erzwingt.
Nicht unbedingt. Was hier passiert, ist, dass sich das Typsystem von Java aufgrund der Typlöschung anders verhält. In Java werden generische Typinformationen zur Laufzeit gelöscht. Das bedeutet, dass Java nicht erzwingt, dass alle Argumente vom gleichen Typ sind, wenn Sie verschiedene Typen an T... args übergeben. Es behandelt die Eingaben einfach als Objekte.
TypeScript hingegen führt strenge Kontrollen sowohl beim Kompilieren als auch zur Laufzeit durch und stellt so sicher, dass alle Argumente mit dem abgeleiteten oder deklarierten Typ übereinstimmen.
Diese Erfahrung hat mich zum Nachdenken gebracht: Sollte Java strengere Typprüfungen erzwingen, wie es TypeScript tut? Oder ist diese Flexibilität ein bewusster Teil des Java-Designs?
Was denkst du? Sind Ihnen beim Wechsel zwischen Java und TypeScript ähnliche Macken begegnet? Ich würde gerne Ihre Gedanken in den Kommentaren hören!
Das obige ist der detaillierte Inhalt vonIst das ein Fehler in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!