2017-02-19 21 views
1

Я хочу объявить два метода. Один из них должен печатать список, а другой должен печатать List>. Поэтому я объявил следующие коды, но с ними что-то не так. Кто-нибудь может помочь мне решить эту проблему.Как сделать эти два 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

Из общего стирания, оба метода в конечном итоге 'печати (набор List)', который, конечно, не допускается компилятором. – Kayaman

+2

Неправильно объясняется ошибка, которую вы получаете от компилятора. Прочтите сообщение об ошибке. Затем переименуйте первый метод printListOfLists (или любое другое имя, которое вы предпочитаете). –

+0

Я бы объединил их в один метод. Существует риск того, что второй метод вызывается, когда вы планируете первый. –

ответ

1

Существует риск того, что второй метод вызывается, когда это на самом деле первый тип, если компилятор не знает тип имеет вложенный список.

Я бы объединить их

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

 Смежные вопросы

  • Нет связанных вопросов^_^