Dlaczego kompilator jest w stanie określić ogólny typ parametru dla przypisania , ale nie dla operatora trójskładnikowego (?
)?Czy w Javie nie można wywnioskować ogólnego typu parametru podczas korzystania z operatora trójskładnikowego (`?`)?
I pytanie odnośnie kompilator jest w stanie wywnioskować, ogólny typ parametru w przypadku „bezpośrednie” przydział, ale uszkodzonej w przypadku trójskładnikowych operatora (?
). Moje przykłady używają klasy Guava Optional
, aby przedstawić mój punkt, ale Myślę, że podstawowy problem jest ogólny i nie ogranicza się do Optional
.
Optional
ma ogólną funkcję absent()
:
public static <T> Optional<T> absent();
i mogę przypisać Optional<T>
do Optional<Double>
:
// no compiler error
final Optional<Double> o1 = Optional.absent();
W jaki sposób uświadomić sobie kompilatora, że T
powinny być Double
w tym przypadku. Ponieważ przy użyciu operatora potrójny (?
), muszę powiedzieć, że kompilator specjalnie nam Integer
jak generycznego parametru
// Type mismatch: cannot convert from Optional<capture#1-of ? extends Object> to Optional<Integer>
final Optional<Integer> o2 = true
? Optional.of(42)
: Optional.<Integer>absent();
inaczej pojawia się następujący błąd
Niezgodność typów: nie można przekonwertować od
Optional<capture#1-of ? extends Object>
doOptional<Integer>
Dlaczego istnieje różnica między "bezpośrednim" przypisaniem i używaniem operator trójskładnikowy ? Czy jest jeszcze coś, czego mi brakuje?
jaki jest typ zwrotu metody 'of'? – sanbhat
Taki sam jak 'nieobecny()': 'public static Opcjonalnie (T reference);' –
Z którą wersją javac kompilujesz to? – Vincent