できないのはなぜでしたキャストは、Javaインタフェース*当*finalですか?

StackOverflow https://stackoverflow.com/questions/1235068

  •  22-07-2019
  •  | 
  •  

質問

import java.util.Collection;


public class Test
{
    public static void main(String[] args)
    {
        Collection c = null;
        Test s = null;

        s = (Test) c;
    }
}

のサンプルコードの上、鋳造collectionオブジェクトテストオブジェクトです。(無視の場合は、nullポインタ.試験 no 関係コレクションも、このプログラムはすべてのコンパイル時の確認をしています。

私はなぜことです。私の仮説は、インターフェースは無視されいに感謝したいと思います。その共通のスーパータイプと各クラスを実装するいくつかのインターフェイスで、クラスまたはインタフェースの階層を行うことができるのではな複雑な検索の効率?

その他の理由私はstumpedものです。なんだろうけど、日本人に?!

役に立ちましたか?

解決

"Non-final-"をキーワードはこちらです。して別のクラス

public class Test2 extends Test implements Collection

そのインスタンスのプラスチック担当 s を完全にキャスト法律に基づいて行われる。

他のヒント

がクラスのサブクラス Test る可能性のあるサブタイプの Collection しましたよ!の言語仕様では異なる場合がありますビットの柔軟性を許可する鋳きを検知する。

までとは異なる見込:体の最終のクラスの鋳るANYインタフェース

import java.util.function.Predicate;

public class Test {
    public static void main(String[] args) {
        Predicate check;

        try {
            /*It's ok to cast to ANY interface because the Base class is not final.
              Java compiler allows it because some class may extend it 
              and implement the predicate interface. 
              So java compiler can check it only at runtime time not compile time.             
            */
            check = (Predicate)(new Base());

            /*
             Java compiler doesn’t allow it because the BaseFinal is final.
             And it means that no one can extend it and implement interface Predicate. 
             So java compiler can check it at compile time.
            */
            //check = (Predicate)(new BaseFinal()); 
        } catch (ClassCastException e) {
            System.out.println("Class Cast Exception");
        }
        check = (Predicate)(Base)(new Child());
    }    
}
final class BaseFinal {};

class Base {}

class Child extends Base implements Predicate {
    public boolean test(Object t) { return true; }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top