7

型キャストセクション 5.5.1を理解するためにJLS 7を調べています。

コンパイル時の参照型 S (ソース) とコンパイル時の参照型 T (ターゲット) が与えられた場合、次の規則によりコンパイル時のエラーが発生しない場合、S から T へのキャスト変換が存在します。S がクラス型の場合:

  • T がクラス型の場合、|S|のいずれかです。<: |T|、または |T| <: |S| . そうしないと、コンパイル時エラーが発生します。

セクション 4.10でS と T が 2 つの型であるかどうかを明確にしました。

  • S :> Tは、S が T のスーパータイプであることを示します
  • S > Tは、 S が T の適切なスーパー タイプであることを示します。これは、 S :> TおよびS != Tを意味します。

|S|の意味がわかりません。. |S|の意味を理解するのを手伝ってください。? プロパティの数と種類、または何か他のことを意味しますか。JLS自体で検索しようとしましたが、意味が見つかりませんでした。前もって感謝します。

4

2 に答える 2

3

タイプ消去のドキュメントよりも、形式的ではない、より適切な説明を提供することはできません。あなたの場合 (クラスのキャスト) 「T がクラス型の場合、|S| <: |T|、または |T| <: |S| のいずれかです。それ以外の場合、コンパイル時エラーが発生します。」つまり、型消去後、ジェネリック型引数が「クラスとサブクラスの関係」にある場合、クラスキャストは正当です。その簡単な例:


    static class Bar {}
    static class FooBar extends Bar {}

    public static void main(String[] args) {

        List<FooBar> foobarList = (List<FooBar>) newList(Bar.class);
        List<Bar> barList = (List<Bar>) newList(FooBar.class);

        System.out.println("No cast class exception :)");
    }

    private static<T> List<?> newList(Class<T> clazz) {
        return new ArrayList<T>();
    }

于 2013-06-15T09:48:27.650 に答える