Java casting in interfaces
casting, interface, java
Solution
When you cast `o1` and `o3` with `(I2)`, you tell the compiler that the class of the object is actually a subclass of its declared type, and that this subclass implements `I2`.
The `Integer` class is final, so `o3` cannot be an instance of a subclass of `Integer`: the compiler knows that you're lying. `C1` however is not final, so `o1` could be an instance of a subtype of `C1` that implements `I2`.
If you make `C1` final, the compiler will complain too:
interface I1 { }
interface I2 { }
final class C1 implements I1 { }
class C2 implements I2 { }
public class Test{
public static void main(){
C1 o1 = new C1();
C2 o2 = new C2();
Integer o3 = new Integer(4);
I2 y = (I2)o3; //compiler complains here !!
I2 x = (I2)o1; //compiler complains too
}
}
Problem
Can someone please explain to me how the compiler does not complain in the first casting, but does complain in the second? ``` interface I1 { } interface I2 { } class C1 implements I1 { } class C2 implements I2 { } public class Test{ public static void main(String[] args){ C1 o1 = new C1(); C2 o2 = new C2(); Integer o3 = new Integer(4); I2 x = (I2)o1; //compiler does not complain I2 y = (I2)o3; //compiler complains here !! } } ```