у меня есть два класса в 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
Это происходит из-за того, что тип выражения времени компиляции для new A ()
равен A
- который может быть ссылкой на экземпляр B
, поэтому приведение разрешено.
Однако во время выполнения ссылка только на экземпляр A
, поэтому приведение не выполняется. Экземпляр только A
не является экземпляром B
. Приведение работает только в том случае, если ссылка действительно относится к экземпляру B
или подклассу.
B расширяет A, и поэтому B может быть преобразован в A. Однако обратное неверно. Экземпляр A не может быть преобразован в B.
Если вы пришли из мира Javascript, вы можете ожидать, что это сработает, но в Java нет « duck typing ».