Как getClass (). GetName () возвращает имя класса универсального типа?

Я знаю, что 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 не работает?

Поскольку ob относится к объекту, который, в свою очередь, несет информацию о своем собственном типе среды выполнения.

Oliver Charlesworth 21.04.2018 12:25

@OliverCharlesworth Если я создам другую переменную T ob1 = ob ;, новая переменная будет ссылаться на тот же объект, который несет информацию о собственном типе времени выполнения, верно? Тогда почему вызов метода getClass () вызывает исключение NullPointer?

Arjun 21.04.2018 12:51

@Arjun - Можете ли вы добавить конкретный пример этого к своему вопросу?

Oliver Charlesworth 21.04.2018 12:53

@lexicore - Готово.

Oliver Charlesworth 21.04.2018 12:53

@OliverCharlesworth Я редактировал вопрос

Arjun 21.04.2018 13:09

Потому что ob - это null в момент, когда вы назначаете его ob1.

Oliver Charlesworth 21.04.2018 13:12

@OliverCharlesworth, теперь я понял, спасибо.

Arjun 21.04.2018 13:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
7
1 675
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

obj относится к реальному объекту (типа String). Во время выполнения непримитивные объекты переносят с собой информацию о своем типе, что и возвращает getClass().

Дженерики на это не влияют (не в последнюю очередь потому, что дженерики не существуют во время выполнения). Это точно так же, как если бы вы сделали что-то вроде этого:

Object ob = "abcd";
System.out.println(ob.getClass().getName());

Другие вопросы по теме