2016-06-03 13 views
7

DlaczegoDlaczego <? extends Number> nie działa dla Integer?

Predicate<? super Integer> isGreaterThanZero = num -> num.intValue() > 0; 

prace dla

isGreaterThanZero.test(new Integer(2)); 

i nie

Predicate<? extends Number> isGreaterThanZero = num -> num.intValue() > 0; 

widzę je jako takie same, ponieważ Integeris-aNumber

+4

Nie używaj opcji 'nowa liczba całkowita()'. – shmosel

Odpowiedz

13

Whe n deklarujesz Predicate<? extends Number> isGreaterThanZero, mówisz kompilatorowi, że isGreaterThanZero jest Predicate parametryzowany przez jakiś nieznany podtyp Number.

Jeśli chodzi o kompilator, może to być Predicate<Double> lub Predicate<BigInteger>. Czy możesz bezpiecznie przekazać Integer do test(Double x) lub ? Nie możesz. Jedyną rzeczą, którą można bezpiecznie przejść na metodę test z Predicate<? extends Number> jest null.

Jeśli chcesz, aby isGreaterThanZero był predykatem działającym na dowolny podtyp Number, powinieneś zadeklarować go jako Predicate<Number>.

+0

, więc to działa dla 'super', ponieważ Integer znajduje się w katalogu głównym moich generycznych? –

+0

jeśli Number ma tylko Integer jako podklasę, czy to zadziała? Czy java wnioskuje (jeśli to odpowiedni termin), że Number ma tylko jedną możliwą podklasę? –

+3

Działa dla 'super', ponieważ' Integer' jest podtypem dowolnej klasy spełniającej symbole wieloznaczne '? super liczba'. Więc niezależnie od klasy, którą reprezentuje symbol wieloznaczny, 'Predicate 'może * zużywać * wartość' Liczba całkowita. Możesz przeczytać http://stackoverflow.com/q/2723397/3920048 dla dogłębnego wyjaśnienia tych zagadnień i * mnemonika * PECS *. – Misha

Powiązane problemy