2016-08-18 4 views
-2

Я пытаюсь создать общий метод findMax (Список списка), который принимает либо List of LocalDate, либо List of Date type, и возвращает максимальное значение в списке.Как написать общий метод findMax() с помощью collections.max()?

Collections.max (List LocalDate) и Collections.max (List Date) работают отлично, но я не знаю, как вернуть его обратно.

Не понимаю, как компаратор работает на Java.

Ниже моя попытка

static List<LocalDate> localDateList = new ArrayList<LocalDate>(); 
static List<Date> dateList = new ArrayList<Date>(); 

private <T> T findMax(List<T> list) { 
    return Collections.max(list); 
} 

public static void main(String[] args) throws ParseException, SQLException, JsonProcessingException { 

    localDateList.add(new Date(11 * 86400000).toInstant().atZone(ZoneId.systemDefault()).toLocalDate()); 
    localDateList.add(new Date(22 * 86400000).toInstant().atZone(ZoneId.systemDefault()).toLocalDate()); 
    localDateList.add(new Date(3 * 86400000).toInstant().atZone(ZoneId.systemDefault()).toLocalDate()); 
    localDateList.add(new Date(14 * 86400000).toInstant().atZone(ZoneId.systemDefault()).toLocalDate()); 
    localDateList.add(new Date(65 * 86400000).toInstant().atZone(ZoneId.systemDefault()).toLocalDate()); 

    dateList.add(new Date(11 * 86400000)); 
    dateList.add(new Date(22 * 86400000)); 
    dateList.add(new Date(3 * 86400000)); 
    dateList.add(new Date(14 * 86400000)); 
    dateList.add(new Date(65 * 86400000)); 

    System.out.println(Collections.max(localDateList)); 
    System.out.println(Collections.max(dateList)); 

    System.out.println(findMax(localDateList)); 
    System.out.println(findMax(dateList)); 

} 

Редакцией: Понял работать путем изменения от

private <T> T findMax(List<T> list) { 
    return Collections.max(list); 
} 

в

private <T extends Object & Comparable<? super T>> T findMax(List<T> list) { 
    return Collections.max(list); 
} 
+1

'Collections.max' уже возвращает« правильный »тип назад. Например, 'String s = Collections.max (yourListOfString)' будет компилироваться. –

+1

В чем проблема с размещенным кодом? Почему вы пытаетесь объединить Collections.max() в метод, выполняющий то же самое? И если вы действительно этого хотите, почему бы вам не использовать те же общие типы, что и Collections.max()? –

+0

Он говорит вам, что это объект из-за стирания стилей. Типичные типы известны только компилятору во время компиляции и в то же время актуальны. Они там, чтобы избежать небезопасных бросков как можно больше. – HopefullyHelpful

ответ

3

Collections.max()

Не нужно писать свой метод findMax. Collections.max уже делает это за вас.

List<LocalDate> localDates = new ArrayList<> (3); 
LocalDate today = LocalDate.now (ZoneId.of ("America/Montreal")); 
localDates.add (today); 
localDates.add (today.plusDays (2)); 
localDates.add (today.minusDays (4)); 

LocalDate max = Collections.max (localDates); 

Дамп для консоли.

System.out.println ("localDates: " + localDates + " | max: " + max); 

localDates: [2016-08-18, 2016-08-20, 2016-08-14] | макс: 2016-08-20

Сравнение

Любой класс, реализующий интерфейс Comparable должен реализовать метод compareTo. Этот метод должен возвращать отрицательное целое число, ноль или положительное целое число, поскольку этот объект меньше, равен или больше другого объекта того же типа.

LocalDate класс имеет этот compareTo метод реализован.

Метод Collections.max объединяет элементы коллекции, такие как List, и вызывает метод каждого объекта compareTo. Все, что сделано от вашего имени, чтобы освободить вас от хлопот написания такого кода.

Дженерики

Комментарии предложить Вопрос был действительно больше о Java Generics, что о сравнении.

Ниже приведен пример реализации вашего метода findMax. Я последовал примеру Collections.max source code для Java 8 в проекте OpenJDK.

Как я уже говорил, нет эффективного использования для просто обертывания вызова Collections.max. Но это действительно хороший пример использования дженериков.

public <T extends Object & Comparable<? super T>> T findMax (Collection<? extends T> coll) { 
    T maximum = Collections.max (coll); 
    return maximum; 
} 

Вызов этого метода и передачи localDates коллекции видели выше.

System.out.println ("findMax: " + this.findMax (localDates)); 
+0

У вас есть ключ, почему они используют 'Object & Comparable'? По моему пониманию, все, что является объектом, 'T extends Comparable' будет непосредственно компилироваться. Я пытаюсь понять. –

+0

А я получаю это, чтобы заставить тип быть «Объектом» в стирании, чтобы поддерживать совместимость с API-интерфейсом предварительного генерации. –

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