Приведение к косвенному подклассу не работает?

#java #inheritance #casting #multiple-inheritance #downcast

#java #наследование #Кастинг #множественное наследование #понижение

Вопрос:

         public class A
    {

      public void printA(){
        System.out.println("A");  
      }

    }


    public class B extends A
    {
       public void printB(){
        System.out.println("B");  
      }

    }

    public class C extends B
    {
       public void printC(){
        System.out.println("C");  
      }

    }

    public class test {
        public static void main(String[] args)
      {

     A  a = new B();
          a.printA(); // work

        B b = (B) a;
          b.printB(); // work

          C c = (C) b;
          c.printC(); // not work throw  java.lang.ClassCastException

      }
}
 

у меня есть три класса A, B и C
C простирается от B, а B простирается от A
почему приведение вниз работает от A до B и не работает от B до C, хотя связь между ними, как A и B, B является родительской для C, так как это работает JVM??

Комментарии:

1. Вы не можете изменить класс объекта, вы можете изменить только класс ссылки.

2. я не понимаю, где я пытаюсь изменить класс объекта в своем коде??

3. Когда вы это делаете (C) b , вы пытаетесь притвориться, что это изменяет тип объекта на a C , но это не так. Тип объекта всегда a B .

4. но B является родительским для C, это правда? итак, C — это instanceof B, и я могу выполнить приведение!!

5. Это уже объясняется во многих местах в Интернете. При всем уважении к stackoverflowers, я сомневаюсь, что все, что будет написано в этом потоке, будет понятнее, чем то, что уже есть. Пожалуйста, проведите свое исследование и изучите ресурсы.

Ответ №1:

Классы могут быть приведены только к их родительским классам, они ничего не знают о своих подклассах.

Поскольку ваш объект является экземпляром B , он не реализует методы C .

Это будет работать:

   A  a = new C();
  a.printA(); // work

  B b = (B) a;
  b.printB(); // work

  C c = (C) b;
  c.printC(); // work 
 

Комментарии:

1. Вы можете привести класс только к его родительскому, но не к его дочернему. Потому что класс ничего не знает о под-классах.