2016-06-03 4 views

ответ

13

Whe n вы объявляете Predicate<? extends Number> isGreaterThanZero, вы сообщаете компилятору, что isGreaterThanZero является Predicate, параметризованным неизвестным подтипом Number.

Насколько известно компилятору, это может быть Predicate<Double> или Predicate<BigInteger>. Можете ли вы безопасно пройти Integer до test(Double x) или до test(BigInteger x)? Ты не можешь. Единственное, что вы можете смело переходить на test метод Predicate<? extends Number> - null.

Если вы хотите, чтобы isGreaterThanZero был предикатом, который работает на любом подтипе Number, вам следует объявить его как Predicate<Number>.

+0

поэтому он работает для 'super', так как Integer находится в корне моих дженериков? –

+0

, если Number имеет только Integer в качестве своего подкласса, будет ли он работать? Будет ли java делать вывод (если это правильный термин), что Number имеет только один возможный подкласс? –

+3

Он работает для 'super', потому что' Integer' является подтипом любого класса, который удовлетворяет шаблону '? super Number'. Итак, какой бы класс не представлял подстановочный знак, 'Predicate 'can * потребляет *' Integer'. Вы можете прочитать http://stackoverflow.com/q/2723397/3920048 подробное объяснение этих проблем и мнемонику * PECS *. – Misha

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