2009-07-23 11 views
1

多くの書籍では、Javaの汎用消去が の理由がレガシーコードとの互換性があると言われています。ジェネリック消去とレガシーコード

私はいくつかの簡単な例を教えてください。 一般コードは古いレガシーコードと相互作用し、逆も同様です。

答えて

3

はここ型消去なしには不可能であろう例です。メソッドは、Collections.sortとして吸う古いコードを呼び出す新しいコードになります。

+0

古い方法と新しい方法を同じ方法で使用することは、あまり良い例ではありません。 –

+0

私はあなたの権利を推測する...方法に変更 –

3

従来のコードとの互換性を持つということは、コンパイルせずに新しいバージョンのJVMで実行できることを意味します。ソースコードのない従来のライブラリがあるとします。これにより、Java 5で実行できるようになります。新しいコードは問題なくレガシーコードを呼び出すことができます。現在のJREとListの同類の用途に

public static void main(String[] args) { 
    List<String> newList = legacyMethod(); 

    for (String s : newList) { 
     System.out.println(s); 
    } 
} 

public static List legacyMethod() { 
    List oldList = new ArrayList(); 
    oldList.add("a"); 
    oldList.add("b"); 
    oldList.add("c"); 
    return oldList; 
} 
1

ラン古いコードは新しい使用して、古いコードになります:

0

まだJava 5に移植されていない古いJavaライブラリを使用します。古いコードが返される場所や、Listを受け取る場所がたくさんあります。消していないと、あなたのコードでジェネリックを使うことはできません(あなたの人生をもっとシンプルにするため)、そしてあなたのリストをパラメータとしてフレームワークに渡すことはできません。ListList<String>StringFileと異なっています。

同様の方法で、ライブラリがリストを返すときは、それを処理するためにイテレータを使ってpre-5構文を使用するか、基本リストを一般化されたものにコピーする必要があります。

これを回避する方法があります。 SunはListList<Object>と同じにするか、神が禁止するList<?>とすることができました。しかしそれはさらに微妙な問題をもたらしていたでしょう。そこで、彼らは、少なくとも抵抗の方法に行き、コンパイル時に一般的な情報(主に)を使用することに決めました。

関連する問題