5

i have two classes in java as:

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);
    }
}

at compile time it does not give error, but at runtime it displays an error : Exception in thread "main" java.lang.ClassCastException: A cannot be cast to B

smci
  • 32,567
  • 20
  • 113
  • 146
Kalpesh Jain
  • 409
  • 3
  • 10
  • 19

4 Answers4

16

This happens because the compile-time expression type of new A() is A - which could be a reference to an instance of B, so the cast is allowed.

At execution time, however, the reference is just to an instance of A - so it fails the cast. An instance of just A isn't an instance of B. The cast only works if the reference really does refer to an instance of B or a subclass.

Jon Skeet
  • 1,421,763
  • 867
  • 9,128
  • 9,194
7

B extends A and therefore B can be cast as A. However the reverse is not true. An instance of A cannot be cast as B.

If you are coming from the Javascript world you may be expecting this to work, but Java does not have "duck typing".

dsmith
  • 1,978
  • 10
  • 16
1

First do it like this :

  A aClass = new B(); 

Now do your Explicit casting, it will work:

   B b = (B) aClass;

That mean's Explicit casting must need implicit casting. elsewise Explicit casting is not allowed.

Sachin Jadhav
  • 111
  • 2
  • 6
Ramesh
  • 31
  • 1
0

Once you create the object of a child class you cannot typecast it into a superClass. Just look into the below examples

Assumptions: Dog is the child class which inherits from Animal(SuperClass)

Normal Typecast:

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

Wrong Typecast:

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

The below Typecast really works:

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

A compiler checks the syntax it's during the run time contents are actually verified

router
  • 582
  • 5
  • 16