3

2 種類のリストがあります。

ArrayList<String> sList;
ArrayList<Resource rList;

.getName()リソース オブジェクトでメソッドを呼び出すことができます。

printList(list)次のようなメソッドを呼び出して、これらのリストのいずれかを印刷できるようにしたいと考えています。

printList(sList);
printList(rList);

それらのコードは次のようになります。

private static void printList(ArrayList<String> list){
    for(String s : list){
        System.out.println(s + ", ");
   }
}

private static void printList(ArrayList<Resource> list){
    for(Resource r : list){
        System.out.println(r.getName() + ", ");
   }
}

を使用する特別な理由はありませんprivate static。日食が提案したため、たまたまそのようになりました。

ただし、コードは機能しません。Eclipse で次のエラーが表示されます。

「メソッド printList(ArrayList) には、タイプ GUI の別のメソッドと同じ消去 printList(ArrayList) があります」

GUI私のクラスです。なにが問題ですか?

編集: 必要な機能を取得するための代替手段または回避策はありますか?

4

4 に答える 4

6

型消去により、両方のメソッドは同じシグネチャを持ちます。つまり、コンパイラは両方を認識します。

なので

private static void printList(ArrayList list)

その後、互いに区別がつかなくなり、コンパイルエラーが発生します。コードをコンパイルしたい場合は、署名を変更する必要があります。

private static void printStringList(ArrayList<String> list)
private static void printResourceList(ArrayList<Resource> list)

またはtoString、すべてのタイプでオーバーライドされている場合はList、次のような一般的な形式を使用して、ポリモーフィズムを有利に利用できます。

private static <T> void printList(List<T> list) {
    for (T t: list) {
        System.out.println(t);
    }
}
于 2013-06-20T12:49:50.760 に答える
1

ジェネリック Resource/String はコンパイラ時にのみ存在します。実行時に 2 つのメソッドを区別することはできません

于 2013-06-20T12:50:57.273 に答える