2012-02-24 7 views
1

Java JDK 6は古い非ジェネリックコレクションをサポートしていますか、または実行時に既存のコードを破棄しますか?Java JDK 6は非汎用レガシーコードを許可しますか?

サポートしている場合は、有効にする必要がありますか?例えばので

List<Integer> list = new ArrayList<Integer>(); 
list.add(5); 

Alpha a = new Alpha(); 
a.insert(list); 

for (Integer integer : list) { 
    System.out.println(integer); 
} 

非ジェネリック(レガシーコード):

public class Alpha { 
    public void insert(List list) { 
    list.add(new String("50")); 
    } 
} 

これは罰金コンパイルが、実行時に休憩。私はそれがうまく動作し、コンパイラはあなたに警告すると思った。

+0

ジェネリックを使用しないと、コンパイラは警告しません。期間。 – BalusC

+0

Java 6は従来のコードと互換性がありませんか? –

+2

私はそれを言っていませんでした。 Java 6は従来のコードと確実に互換性があります。コンパイル時に間違った生の型を使用しているときに警告することはありません。ジェネリックスを使用しない場合、古いJavaバージョンではまったく同じ問題が発生します。 – BalusC

答えて

4

ジェネリックソートは、コンパイル時にのみ存在します。 (まったくそうではありませんが、メタデータは残っていますが、オブジェクトタイプ自体は影響を受けておらず、特にArrayListの配列はObject[]です。)常にはジェネリックを使用します非ジェネリック型のようにタイプします - コンパイラはあなたに警告しますが、クラス自体はあなたの行為を止めることはできません。

あなたのコードブレークあなたが暗黙のうちに、ここで整数に配列の各要素をキャストしているので:

for (Integer integer : list) { 
    System.out.println(integer); 
} 

どのようにして、実行時に処理されることを期待しでしょうか?確かにあなたが持っているように(

for (Iterator iterator = list.iterator(); iterator.hasNext();) { 
    Integer integer = (Integer) list.next(); 
    System.out.println(integer); 
} 

あなたはジェネリックのない世界にいる想像して、あなたは、リスト内のStringを得たい場合にはどうなるのかと思う:明確にするために、コンパイルされたコードはほぼ同等です、Alphaのおかげで)。全く同じもの(ClassCastException)がジェネリックで起こります。

+0

うん、私はそれを得た。ありがとう –

+0

うん、私は、良い説明をそれを得た。私はロンドンでjoel spolsky talkに行きましたStackoverflowについてあなたは彼がコミュニティに貢献したと言われましたが、なぜ私はその理由を知っています。 :) –

+0

@nakul:私はあなたのコメントを理解していないのが怖いです。私はあなたが正直であるために新しい質問をすることをお勧めしたいと思う。 –

2

コンパイラはこれについて警告します。

詳細については、-Xlintオプションを付けてjavacを実行してください。

警告:[未確認]未確認コール生タイプのメンバーとして(E)を追加するjava.util.Listに list.add(新しい文字列( "50"));あなたは型なし(生タイプ)のリストを使用したい場合は

そしてちょうど1が同様のレガシーコードを使用して作成します。

List list = new ArrayList(); 

しかし、あなたはあなたに追加の文字列をキャストするとき、あなたのコードはまだ実行時に失敗します整数へのリスト

+0

うん、私はそれを得た、私は-Xlintについては知らなかった。 –

関連する問題