ClassCastException

у меня есть два класса в 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);
    }
}

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

5
задан smci 1 February 2012 в 22:37
поделиться

2 ответа

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

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

16
ответ дан 18 December 2019 в 06:34
поделиться

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

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

7
ответ дан 18 December 2019 в 06:34
поделиться
Другие вопросы по тегам:

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