2014-09-15 4 views
0

У меня довольно большая проблема с созданием общего метода для заказа. На данный момент у меня есть эта функция:Guava generic для заказа

public <T> T orderAscending(Function<?, ? extends Comparable> function, Iterable<? extends LinkedList<?>> sortingList) { 
    return Ordering.natural().onResultOf(function).sortedCopy(sortingList); 
} 

Первый параметр этой функции создается таким образом:

public static Function<ParkingWebApiDTO, Date> getSortActiveParkingsByStartDate() { 
     Function<ParkingWebApiDTO, Date> getStartDateFunction = new Function<ParkingWebApiDTO, Date>() { 
      @Override 
      public Date apply(ParkingWebApiDTO parkingWebApiDTO) { 
       return parkingWebApiDTO.getStartDate(); 
      } 
     }; 
     return getStartDateFunction; 
    } 

и второй один LinkedList с некоторыми пользовательского объекта в нем (List<MyObject> test = new LinkedList<MyObject>()).

Пожалуйста, помогите мне исправить этот общий метод orderAscending. Большое спасибо за помощь.

+1

Вы забыли упомянуть о том, какова актуальная проблема ... –

+0

Проблема с компиляцией :) –

+0

Не могли бы вы затем поделиться с нами ошибкой компиляции? Вероятно, это еще одна проблема с типичным типом вывода. Или может быть, что результат 'sortedCopy()' ('List ', из 'Iterable ' ввода) возвращается как 'T' ... –

ответ

1

Я думаю, вы хотели создать List (отсортировано по дате начала) от Iterable ваших DTO (я полагаю, вы не хотите, чтобы итерабельны списки DTO).

Так скажем, ваш DTO выглядит следующим образом:

interface ParkingWebApiDTO { // could be simple class, etc. 
    Date getStartDate(); 
    // ...and more methods here 
} 

у вас есть список ввода:

LinkedList<? extends ParkingWebApiDTO> iterable = Lists.newLinkedList(); 

и функцию, которая извлекает дату начала из DTO:

Function<ParkingWebApiDTO, Date> function = new Function<ParkingWebApiDTO, Date>() { 
    @Override 
    public Date apply(ParkingWebApiDTO dto) { 
    return dto.getStartDate(); 
    } 
}; 

вы ожидаете вывода следующим образом:

List<? extends ParkingWebApiDTO> result = orderAscending(function, iterable); 

, которые могут быть достигнуты с следующие orderAscending imlementation:

public static <X, T extends Comparable<T>> List<? extends X> orderAscending(
    Function<X, T> function, Iterable<? extends X> sortingList) { 
    return Ordering.natural().onResultOf(function).sortedCopy(sortingList); 
} 

Вы должны объявить как от и к типам, как родовые типы, если вы хотите иметь «универсальный» метод.

Другое дело, если вы действительно нужно иметь такое общее название, потому что использование Ordering.natural().onResultOf(function).sortedCopy(list) прекрасно подходит и с orderAscending ИМО избыточна (Вы закончите с большим количеством способов, как этот).

+0

Замечательно! Большое вам спасибо. Это то, что я искал. –

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