Я знаю, что java использует стирание типов для универсальных типов, а в документации java говорится, что getClass() возвращает класс среды выполнения объекта, но следующая программа печатает имя класса универсального типа.
код:
public class Gen<T> {
T ob;
public Gen(T ob) {
this.ob=ob;
}
void showType() {
System.out.println("Type of T is "+ ob.getClass().getName());
}
}
public class GenDemo {
public static void main(String[] args) {
Gen<String> str = new Gen("abcd");
str.showType();
}
}
вывод: Type of T is java.lang.String
Как работает эта программа? Каким образом он получает класс среды выполнения нереифицируемого типа?
EDIT
public class Gen<T> {
T ob;
T ob1=ob;
public Gen(T ob) {
this.ob=ob;
}
void showType() {
System.out.println("Type of T is "+ ob.getClass().getName());
}
void showType1(){
System.out.println(ob1.getClass().getName());
}
}
public class GenDemo {
public static void main(String[] args) {
Gen<String> str = new Gen("abcd");
str.showType();
str.showType1();
}
}
output:
Exception in thread "main" java.lang.NullPointerException
at Gen.showType1(Gen.java:13)
at GenDemo.main(GenDemo.java:7)
Почему вызов того же метода на ob1 не работает?
@OliverCharlesworth Если я создам другую переменную T ob1 = ob ;, новая переменная будет ссылаться на тот же объект, который несет информацию о собственном типе времени выполнения, верно? Тогда почему вызов метода getClass () вызывает исключение NullPointer?
@Arjun - Можете ли вы добавить конкретный пример этого к своему вопросу?
@lexicore - Готово.
@OliverCharlesworth Я редактировал вопрос
Потому что ob - это null в момент, когда вы назначаете его ob1.
@OliverCharlesworth, теперь я понял, спасибо.




obj относится к реальному объекту (типа String). Во время выполнения непримитивные объекты переносят с собой информацию о своем типе, что и возвращает getClass().
Дженерики на это не влияют (не в последнюю очередь потому, что дженерики не существуют во время выполнения). Это точно так же, как если бы вы сделали что-то вроде этого:
Object ob = "abcd";
System.out.println(ob.getClass().getName());
Поскольку
obотносится к объекту, который, в свою очередь, несет информацию о своем собственном типе среды выполнения.