1: Implicit casting (widening conversion)
A data type of lower size (occupying less memory) is assigned to a data type of higher size. This is done implicitly by the JVM. The lower size is widened to higher size. This is also named as automatic type conversion.
Examples:
    int x = 10;                    // occupies 4 bytes
    double y = x;                  // occupies 8 bytes
    System.out.println(y);         // prints 10.0
In the above code 4 bytes integer value is assigned to 8 bytes double value.
- Explicit casting (narrowing conversion)
A data type of higher size (occupying more memory) cannot be assigned to a data type of lower size. This is not done implicitly by the JVM and requires explicit casting; a casting operation to be performed by the programmer. The higher size is narrowed to lower size.
   double x = 10.5;             // 8 bytes
   int y = x;                   // 4 bytes ;  raises compilation error
1
2
       double x = 10.5;             // 8 bytes
       int y = x;                   // 4 bytes ;  raises compilation error
In the above code, 8 bytes double value is narrowed to 4 bytes int value. It raises error. Let us explicitly type cast it.
   double x = 10.5;                  
   int y = (int) x; 
1
2
       double x = 10.5;
       int y = (int) x; 
The double x is explicitly converted to int y. The thumb rule is, on both sides, the same data type should exist.