2016-08-10 11 views
12

ベクトルで手を入れていて、列挙を通じてその要素にアクセスする簡単なコードを書きました。String型のパラメータでベクトルを列挙すると、ClassCast例外が発生しますが、型パラメータとしてInteger型の例外はありません。

Vector v = new Vector(); 
    v.add("Some String"); 
    v.add(10); 

    Enumeration e = v.elements(); 
    while(e.hasMoreElements()) System.out.println(e.nextElement()); 

生の種類を使用すると、期待どおりの結果が得られます(要素を印刷します)。しかし、一般的なタイプの列挙子を使用すると、複雑になります。

Vector v = new Vector(); 
    v.add("Some String"); 
    v.add(10); 

    Enumeration<String> e = v.elements(); 
    while(e.hasMoreElements()) System.out.println(e.nextElement()); 

出力:スレッド "メイン" とjava.lang.ClassCastExceptionで

いくつかの文字列

例外:java.lang.Integerでは、することはできませんtypeパラメータとして文字列を使用して

java.lang.Stringへのキャスト

Integer型パラメータ:

Vector v = new Vector(); 
    v.add("Some String"); 
    v.add(10); 

    Enumeration<Integer> e = v.elements(); 
    while(e.hasMoreElements()) System.out.println(e.nextElement()); 

出力:

いくつかの文字列

ここで何が起こっていますか? 両方のケースでClassCast例外が生成されるべきではありませんか?

+1

'Enumeration <> e = v.elements();'これはどのようにコンパイルされますか? –

+0

@ ConstantinYovkov私はそれが誤字だと思うし、OPは 'Enumeration 'を意味していた。 – Mena

+0

'Vector'生の型を使用しています:http://stackoverflow.com/a/2770692/1608594生の型は使用しないでください。 – carbolymer

答えて

5

コンパイル時にすべてのジェネリックが消去されることに注意してください。コンパイラが間違いを起こしていないことを確認するのに役立ちます。おそらく、生のタイプを使用しないでください(Vector<String>の代わりに生の手段Vectorなど)、この点でいくつかの警告が表示される可能性があります。生の型に相当するジェネリック型は<?>であることを示しています。これは、任意の型を許可することを示しています。

ご覧の行動は名前System.out.println()と異なるパラメータ型を持つ2つの(実際にはより多くのいくつかが、あなたの場合、2つが使用されている)の機能があるため、これは(メソッドのオーバーロード)と呼ばれている。

  1. System.out.println(String)を
  2. のSystem.out.println(Object)をあなたのコードのために呼ばれることが決定され、コンパイル時に

Stringの例では、列挙型は汎用タイプStringを持ち、最初のものを呼び出します。しかし、VectorIntegerオブジェクトが渡されると、Stringにキャストするときにエラーが発生します。 したがって、この場合には、コンパイラは(おおよそ)以下にコードを変換します

Enumeration e = v.elements(); 
while(e.hasMoreElements()) System.out.println((String)e.nextElement()); 

整数の例では、列挙はとてもすべて、StringIntegerの両方を受け入れる、System.out.println(Object)にマッピングされますジェネリック型Integerを持っていますうまくいっている。追記で

:デフォルトでは、あなたがArrayList代わりのVectorを使用する必要があり、それはVectorでレガシー方法による非常にきれいなインターフェースを持っています。また、Vectorが同期しているため、不要なオーバーヘッドが発生します。

関連する問題