Я уверен, что мой вопрос не имеет смысла, но это потому, что я не знаю, что я вижу или как его описывать...
Следующий код компилируется отлично, но он не должен, потому что int
не является тем же типом, что и Integer
. Должно ли это дать ошибку компилятора? И если компилятор ожидает тип Class<Integer>
, то как во время выполнения он получает разрешение на Class<int>
? Это какая-то магия, где компилятор разрешает ей использовать примитивы? И если компилятор релаксирует проверку на примитивах, это не приводит к ошибкам, когда авторы методов ожидают, что тип будет ТОЧНЫМ типом Class<Integer>
и вместо этого будет доставлен Class<int>
.
Короче говоря, почему это компилируется и создает результат correct
или wrong
(в зависимости от перспективы) во время выполнения.
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");
}
выход:
int : int
Integer : class java.lang.Integer
AreEqual: false
Для контрольной группы этот код делает NOT COMPILE
, как я ожидал бы
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 {
}
Ошибки:
Error:(8, 40) java: incompatible types: java.lang.Class<com.company.Employee> cannot be converted to java.lang.Class<com.company.Person>