2013-06-15 16 views
6

タイプキャストを理解するために、 JLS 7を調べています。Section 5.5.1Java言語仕様:表記の意味| S |

それは言う:なしコンパイル時エラーが原因に を生じない場合はコンパイル時参照型S(ソース)とコンパイル時参照型 T(ターゲット)が与えられると、キャスティングの変換はSからTに存在以下のルールに従います。 Sがクラス型の場合:Tがクラス型である場合には、いずれか

  • | S | <:| T |、または| T | <:| S |。それ以外の場合は、コンパイル時に エラーが発生します。

SとTはSection 4.10で2種類、そして

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

の意味を見つけることができません。。それが何を意味するのか理解してください。 | S |?これは、プロパティの数や種類などを意味しますか? JLSで検索しようとしましたが、意味が見つかりませんでした。前もって感謝します。

+4

だから私が見つかりました:http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.6「私たちが書く| Tを|タイプTの消去のために " – mrak

+0

ありがとうございました。 –

答えて

2

私は、タイプ消去のために文書がより良く、より少なく正式な説明を提供することができません。 あなたの場合(クラスキャスティング) "Tがクラス型の場合、| S | <:| T |、または| T | <:| S |。そうでないと、コンパイル時エラーが発生します。タイプ消去後に、ジェネリック型引数が "class-subclass relationship"にある場合、クラスキャストは合法であることを意味します。そのための簡単な例:

 

    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>(); 
    } 
 
+0

返信いただきありがとうございます。私はちょうど場面の裏で働く理論を理解したかった。 –

関連する問題