Это дает вам ошибку, потому что a
не экземпляр C
- так что вы не можете опустить его. Представьте, если бы это было разрешено - вы могли бы сделать:
Object o = new Object();
FileInputStream fis = (FileInputStream) o;
Что бы вы ожидали, если бы попытались читать из потока? Из какого файла вы ожидаете, что он будет читать?
Теперь для второй части:
A a=new A();
C c=new C();
C c=(C)a;
Это будет не нормально работать - для начала он даже не скомпилируется, так как вы объявляете одну и ту же переменную (c
) дважды; если вы исправите эту ошибку, вы все равно получите исключение при попытке привести экземпляр A
к C
.
Однако этот код действительно действителен:
A a = new C(); // Actually creates an instance of C
C c = (C) a; // Checks that a refers to an instance of C - it does, so it's fine