2017-02-19 8 views
1

私は2つのメソッドを宣言したいと思います。そのうちの1人はListを印刷し、もう1人はList>を印刷します。だから私は次のコードを宣言したが、何か問題がある。誰も私がこの問題を解決するのを助けることができるでしょうか?これらの2つのJavaジェネリックメソッドを同じクラスで宣言する方法

/* print the List<List<String>> */ 
public static <T> void print(List<List<T>> set) { 
    if (set == null) return; 
    for (List<T> subSet : set) { 
     System.out.print("["); 
     for (int i = 0; i < subSet.size() - 1; i++) { 
      System.out.print(subSet.get(i) + ", "); 
     } 
     if (subSet.size() >= 1) { 
      System.out.print(subSet.get(subSet.size() - 1)); 
     } 
     System.out.println("]"); 
    } 
} 

/* print the List<String> */ 
public static <T> void print(List<T> set) { 
    if (set == null) return; 
    int size = set.size(); 
    System.out.print("["); 
    for (int i = 0; i < size - 1; i++) { 
     System.out.print(set.get(i) + ", "); 
    } 
    System.out.println(set.get(set.size() - 1) + "]"); 
} 
+4

を組み合わせたでしょう、両方の方法はもちろん、コンパイラによって許可されていない 'プリント(リストセット)'になってしまいます。 – Kayaman

+2

コンパイラから受け取ったエラーには、何が間違っているかが説明されています。エラーメッセージを読んでください。次に、最初のメソッドの名前をprintListOfLists(または好みの名前)に変更します。 –

+0

私はそれらを1つの方法に組み合わせます。最初のものを意図したときに2番目のメソッドが呼び出されるリスクがあります。 –

答えて

1

コンパイラは型がネストされたリストを持って知っていない場合、それは実際には最初のタイプであるときに、第2のメソッドが呼び出されるというリスクがあります。

私があるため、一般的な消去の彼らに

public static <T> void print(Collection<T> set) { 
    if (set == null) { 
     System.out.print("null"); 
     return; 
    } 
    System.out.print("[ "); 
    String sep = ""; 
    for (T t : set) { 
     System.out.print(sep); 
     sep = ", "; 
     if (t instanceof Collection) { 
      print((Collection) t); 
     } else { 
      System.out.print(t); 
     } 
    } 
    System.out.print(" ]"); 
} 

public static <T> void println(Collection<T> set) { 
    print(set); 
    System.out.println(); 
} 
+1

私はジェネリックパラメータ 'T'をワイルドカードで置き換えるべきだと思います:' Collection set'と 'for(Object t:set)' – Calculator

+0

@Calculator全く同じものではないでしょうか? –

+1

@ToddSewell意味的には、メソッドのシグネチャは同等です。私はそれがリスト項目の 'toString()'メソッドを必要とするだけの印刷機能なので、ワイルドカードで 'T'を置き換えることができます。この関数は項目を取り出したり再挿入したりすることはありません。これは、型保証をするために特定の型パラメータ 'T'を導入する必要があります。少なくとも私は '(Collection)t'を'(Collection )t'に置き換えてコンパイラの警告を削除しました。 – Calculator

関連する問題