ClassCastException - PullRequest
       46

ClassCastException

5 голосов
/ 22 июня 2010

У меня есть два класса в Java как:

class A {

 int a=10;

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

class B extends A {

 int a=20;

 public void sayhello() {
 System.out.println("class B");
 }

}

public class HelloWorld {
    public static void main(String[] args) throws IOException {

 B b = (B) new A();
     System.out.println(b.a);
    }
}

во время компиляции это не дает ошибку, но во время выполнения он отображает ошибку: Исключение в потоке "main" java.lang.ClassCastException: Aне может быть приведен к B

Ответы [ 4 ]

16 голосов
/ 22 июня 2010

Это происходит из-за того, что тип выражения времени компиляции new A() равен A, что может быть ссылкой на экземпляр B, поэтому приведениепозволено.

Однако во время выполнения ссылка относится только к экземпляру A, поэтому он не может выполнить приведение.Экземпляр просто A не является экземпляром B.Приведение работает только в том случае, если ссылка действительно ссылается на экземпляр B или подкласс.

7 голосов
/ 22 июня 2010

B расширяет A и, следовательно, B может быть разыграно как A. Однако обратное неверно. Экземпляр A не может быть разыгран как B.

Если вы пришли из мира Javascript, возможно, вы ожидаете, что это сработает, но в Java нет " duck typing ".

1 голос
/ 18 февраля 2015

Сначала сделайте это так:

  A aClass = new B(); 

Теперь выполните явное приведение, оно будет работать:

   B b = (B) aClass;

Это означает, что явное приведение должно требовать неявного преобразования.в противном случае явное приведение не допускается.

0 голосов
/ 10 апреля 2015

После создания объекта дочернего класса вы не можете типизировать его в суперкласс.Просто посмотрите на приведенные ниже примеры

Допущения: Dog - это дочерний класс, который наследуется от Animal (SuperClass)

Normal Typecast:

Dog dog = new Dog();
Animal animal = (Animal) dog;  //works

Неправильный Typecast:

Animal animal = new Animal();
Dog dog = (Dog) animal;  //Doesn't work throws class cast exception

Следующий Typecast действительно работает:

Dog dog = new Dog();
Animal animal = (Animal) dog;
dog = (Dog) animal;   //This works

Компилятор проверяет синтаксисво время выполнения содержимое фактически проверяется

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...