Ich bin sicher, dass meine Frage nicht sinnvoll, aber es ist, weil ich nicht weiß, was ich sehe oder wie es zu beschreiben ...Hat int.class autobox Klasse <Integer>
Der folgende Code kompiliert gut, aber es sollte nicht, weil int
nicht der gleiche Typ wie Integer
ist. Sollte das nicht einen Compilerfehler ergeben? Und wenn der Compiler den Typ Class<Integer>
erwartet, wie wird er zur Laufzeit in Class<int>
aufgelöst? Ist das etwas Magie, wo der Compiler es auf Primitive setzt? Und wenn der Compiler die Validierung von Primitiven lockert, führt das nicht zu Fehlern, bei denen die Methodenschreiber erwarten, dass der Typ der EXACT-Typ Class<Integer>
ist und stattdessen Class<int>
geliefert wird.
Kurz gesagt, warum kompiliert und produziert das correct
oder wrong
(je nach Perspektive) Ergebnis zur Laufzeit.
public static void main(String[] args) {
printClass("int ", int.class);
printClass("Integer ", Integer.class);
System.out.printf("AreEqual", int.class == Integer.class);
}
private static void printClass(String text, final Class<Integer> klazz) {
System.out.printf("%s: %s%s", text, klazz, "\n");
}
Ausgang:
int : int
Integer : class java.lang.Integer
AreEqual: false
Für die Kontrollgruppe, dieser Code tut NOT COMPILE
wie ich
public static void main(String[] args) {
printClass("Person ", Person.class);
printClass("Employee", Employee.class);
System.out.printf("AreEqual: %s", Person.class == Employee.class);
}
private static void printClass(String text, final Class<Person> klazz) {
System.out.printf("%s: %s%s", text, klazz, "\n");
}
public class Employee extends Person {
}
public class Person {
}
Fehler erwarten:
Error:(8, 40) java: incompatible types: java.lang.Class<com.company.Employee> cannot be converted to java.lang.Class<com.company.Person>
immer Fehler erwähnen, wenn ein [MCVE] bietet, gibt es 2 Fehler beim Kompilieren: 'Main.java:13: Fehler: inkompatible Typen: Klasse kann nicht in Klasse umgewandelt werden printClass ("Employee", Employee.class); 'und' Main.java:14: error: Unvergleichbare Typen: Class und Class System.out.printf ("AreEqual:% s ", Person.class == Employee.class);' –
Ferrybig
Weil es bei Objekten nicht kompiliert wird (siehe das Beispiel der Person). Warum funktionieren Primitive anders als Objekte?Insbesondere muss der Typ, der an die Methode übergeben wird, für alle anderen Fälle GENAU übereinstimmen, mit Ausnahme des primitiven Falls, der mit int beschrieben wurde. – leat