@webartisan2

Приведение типов в Java?

Добрый день!
Разбираюсь с приведением типов в Java. Пишу следующий код:
public static void main( String[] args ) throws Exception {
        A a = new B();
        System.out.println(a.getClass().toString());
        ((B) a).testB();
    }

    static class A {
        public void testA() {
            System.out.println("A class, A method...");
        }
    }

    static class B extends A {
        public void testB() {
            System.out.println("B class, B method...");
        }
    }

На консоль выводится:
class algorithms.App$B
B class, B method...
И, собственно, вопрос: почему getClass() говорит о том, что переменная a имеет тип B, если для использования функционала класса B необходимо все равно тип привести к B.
Заранее спасибо за ответ!
  • Вопрос задан
  • 638 просмотров
Решения вопроса 1
@D3lphi
getClass() возвращает объект типа Class<T>, по сути, этот объект представляет тип, который имеет какая либо сущность. Выполняется этот метод в рантайме.
Проверка типов же осуществляется на этапе компиляции.
Переменная a имеет тип A, поэтому для того, чтобы работать с этой переменной, как с объектом типа B вам нужно его явно привести к этому типу. Вы не сможете просто так без каста выполнить вызов a.testB() так как для компилятора этот объект имеет тип A (а в нем не существует метода с сигнатурой testB()).

Тем не менее, с помощью рефлексии вы можете вызвать метод динамически:
java.lang.reflect.Method method = a.getClass().getMethod("testB");
method.invoke(a);

Но в таком случае, вы лишаетесь проверки типов на этапе компиляции.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы