jestem pewien, że moje pytanie nie ma sensu, ale to dlatego, że nie wiem, co widzę i jak to opisać ...Czy int.class Autobox do klasy <Integer>
Poniższe kompiluje kod dobrze, ale nie powinno, ponieważ int
nie jest tego samego typu co Integer
. Czy nie powinno to spowodować błędu kompilatora? A jeśli kompilator oczekuje typu Class<Integer>
, jak w czasie wykonywania, zostanie on rozwiązany na Class<int>
? Czy jest to jakaś magia, w której kompilator pozwala działać prymitywom? A jeśli kompilator zwalnia walidację na prymitywach, nie prowadzi to do błędów, w których twórcy metod oczekują, że typ będzie typu EXACT Class<Integer>
, a zamiast tego zostanie dostarczony Class<int>
.
W skrócie, dlaczego ta kompilacja i generowanie correct
lub wrong
(w zależności od perspektywy) wynikają w czasie wykonywania.
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");
}
wyjściowa:
int : int
Integer : class java.lang.Integer
AreEqual: false
dla grupy kontrolnej, ten kod robi NOT COMPILE
jak spodziewałbym
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 {
}
błędów:
Error:(8, 40) java: incompatible types: java.lang.Class<com.company.Employee> cannot be converted to java.lang.Class<com.company.Person>
Zawsze wspominaj o błędach podczas dostarczania [MCVE], podczas kompilacji występują 2 błędy: 'Main.java:13: błąd: niekompatybilne typy: Klasa nie może zostać przekonwertowana na klasę printClass ("Pracownik", Employee.class); 'i' Main.java:14: błąd: nieporównywalne typy: Klasa i Class System.out.printf ("AreEqual:% s ", Person.class == Employee.class);' –
Ferrybig
Ponieważ nie kompiluje się w przypadku obiektów (patrz przykład osoby). Dlaczego prymitywy działają inaczej niż obiekty?konkretnie typ przekazany do metody musi pasować DOKŁADNIE dla WSZYSTKICH innych przypadków z wyjątkiem przypadku pierwotnego opisanego przez int. – leat