Java casting in interfaces

前端 未结 4 2101
悲&欢浪女
悲&欢浪女 2020-12-02 11:52

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 { }         


        
4条回答
  •  情深已故
    2020-12-02 12:21

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

提交回复
热议问题