Я написал служебный метод в Java:Java6, гуавы, дженерики, тип вывода
public static final ImmutableSortedSet<TimeUnit> REVERSED_TIMEUNITS = ImmutableSortedSet.copyOf(
Collections.<TimeUnit>reverseOrder(),
EnumSet.allOf(TimeUnit.class)
);
/**
* Get the number of ..., minutes, seconds and milliseconds
*
* You can specify a max unit so that you don't get days for exemple
* and can get more than 24 hours if you want to display the result in hours
*
* The lowest unit is milliseconds
* @param millies
* @param maxTimeUnit
* @return the result map with the higher unit first
*/
public static Map<TimeUnit,Long> getCascadingDateDiff(long millies,TimeUnit maxTimeUnit) {
if (maxTimeUnit == null) {
maxTimeUnit = TimeUnit.DAYS;
}
Map<TimeUnit,Long> map = new TreeMap<TimeUnit,Long>(Collections.<TimeUnit>reverseOrder());
long restInMillies = millies;
Iterable<TimeUnit> forUnits = REVERSED_TIMEUNITS.subSet(maxTimeUnit,TimeUnit.MICROSECONDS); // micros not included
// compute the number of days, then number of hours, then minutes...
for (TimeUnit timeUnit : forUnits) {
long numberForUnit = timeUnit.convert(restInMillies,TimeUnit.MILLISECONDS);
map.put(timeUnit,numberForUnit);
restInMillies = restInMillies - timeUnit.toMillis(numberForUnit);
}
return map;
}
Он работает с:
Map<TimeUnit,Long> map = new TreeMap<TimeUnit,Long>(Collections.reverseOrder());
Но я впервые попробовал с
Map<TimeUnit,Long> map = Maps.newTreeMap(Collections.reverseOrder());
My IntelliJ ничего не говорит, а мой компилятор говорит:
DateUtils.java:[302,48] несовместимые типы; нет экземпляров (ов) типа переменных (переменных) K, V, чтобы java.util.TreeMap соответствовал java.util.Map [ERROR] найдено: java.util.TreeMap [ERROR] требуется: java. util.Map
Он отлично работает без компаратора:
Map<TimeUnit,Long> map = Maps.newTreeMap();
Но я попытался с:
Map<TimeUnit,Long> map = Maps.newTreeMap(Collections.<TimeUnit>reverseOrder());
И:
Map<TimeUnit,Long> map = Maps.newTreeMap(new Comparator<TimeUnit>() {
@Override
public int compare(TimeUnit timeUnit, TimeUnit timeUnit1) {
return 0;
}
});
И у меня такая же ошибка. Так кажется, каждый раз, когда я использую компаратор в TreeMap, вывод типа больше не работает. Почему?
Сигнатура метода гуавы:
public static <C, K extends C, V> TreeMap<K, V> newTreeMap(Comparator<C> comparator)
Ожидаемый возвращаемый тип типа так без компаратора, Java может сделать вывод, что K = TimeUnit и V = Long.
С компаратором типа TimeUnit Java знает, что C является TimeUnit. Он также знает, что ожидаемый тип возврата имеет тип, поэтому K = TimeUnit и V = Long. K extends C уважается, так как TimeUnit расширяет TimeUnit (во всяком случае, я также пытался с компаратором объектов, если вы считаете, что это неправильно ...)
Так что мне просто интересно, почему вывод типа не работает в этом случае?
Пусть ваша проблема будет связана с этим вопросом? http://code.google.com/p/guava-libraries/issues/detail?id=635 –
Да, может быть, так как я использую OpenJDK. –
в основном то же, что и ваш вопрос [здесь] (http://stackoverflow.com/questions/10945616/whats-this-generics-usage-in-java), используйте определенную форму Maps. newTreeMap (...). –
kutschkem