1. ホーム
  2. java

インタフェースにおけるJavaのキャスティング

2023-08-30 10:48:51

質問

最初のキャストではコンパイラが文句を言わないのに、2 番目のキャストでは文句を言うのはどういうことか、誰か説明してください。

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

どのように解決するのですか?

をキャストすると o1o3(I2) と記述することで、オブジェクトのクラスが実際には宣言された型のサブクラスであり、このサブクラスが I2 .

Integer クラスは 最終 であるため o3 のサブクラスのインスタンスにはなりえません。 Integer のサブクラスのインスタンスになることはできません。 C1 は最終的なものではありませんから o1 が可能です。 のサブタイプのインスタンスである。 C1 を実装している I2 .

もしあなたが C1 を final にすると、コンパイラも文句を言うでしょう。

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