Строго в соответствии со спецификацией, T
не может быть выведен (согласно 15.12.2.7), поэтому его следует принять как Object
.
Это можно рассматривать как сбой спецификации.Вот как спецификация выводит R
: сначала есть ограничение R :> BigDecimal
, где :>
означает, что является супертипом .Затем в правилах вывода выбирается R=BigDecimal
, поскольку это наиболее конкретный тип, удовлетворяющий ограничению.
Теперь, начиная с T:>R
, T:>BigDecimal
, можно подумать, что это также должно дать T=BigDecimal
.
К сожалению, правила вывода не учитывают T:>R
.На T
нет никаких ограничений.T
не выводится по тому же принципу.
Пока это отстой, спец.Ваш код не должен компилироваться.В Javac6 все не так.
В Java 8 значительно улучшены правила вывода, которые упрощают использование лямбда-выражений.Надеюсь, ваш код должен скомпилироваться в Java 8.