我想創建一個泛型方法findMax(List list),它需要LocalDate的List或Date類型的List,並返回列表中的最大值。如何使用collections.max()編寫通用findMax()方法?
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);
}
'Collections.max'已經返回「正確」類型。例如,'String s = Collections.max(yourListOfString)'將被編譯。 –
發佈的代碼有什麼問題?你爲什麼試圖將Collections.max()包裝成一個完全相同的方法?如果你真的想,爲什麼不使用與Collections.max()完全相同的泛型? –
它告訴你,這是一個對象,因爲類型擦除。泛型類型只在編譯時由編譯器知道,並且只與當時相關。他們儘可能避免不安全的演員。 – HopefullyHelpful