2012-06-08 2 views
6

Я написал служебный метод в 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 (во всяком случае, я также пытался с компаратором объектов, если вы считаете, что это неправильно ...)

Так что мне просто интересно, почему вывод типа не работает в этом случае?

+0

Пусть ваша проблема будет связана с этим вопросом? http://code.google.com/p/guava-libraries/issues/detail?id=635 –

+0

Да, может быть, так как я использую OpenJDK. –

+0

в основном то же, что и ваш вопрос [здесь] (http://stackoverflow.com/questions/10945616/whats-this-generics-usage-in-java), используйте определенную форму Maps. newTreeMap (...). – kutschkem

ответ

7

Как Майкл Laffargue предположил, что это OpenJDK6 тип логического вывода ошибка:

https://bugs.openjdk.java.net/show_bug.cgi?id=100167

http://code.google.com/p/guava-libraries/issues/detail?id=635

Это отлично работает в моей IntelliJ, и с OpenJDK в 7-ой версии, а также с другими JDK в версии 6.


Следующая внушение kutschkem работы:

Map<TimeUnit,Long> map = Maps.<TimeUnit,TimeUnit,Long>newTreeMap(Collections.<TimeUnit>reverseOrder()); 

Обратите внимание на <TimeUnit,TimeUnit,Long>, который позволяет заставить типизированных параметров в явном виде. Проверьте это связанные темы: What's this generics usage in Java? X.<Y>method()

Спасибо всем

+0

Ссылка openjdk выше не работает, но я верю https: //bugs.openjdk.java.net/browse/JDK-6569074 тот же или похожий. – andrewdotn