Starałem się znaleźć odpowiedni tytuł dla tego pytania, ponieważ zaobserwowane przeze mnie zjawisko jest bardzo dziwne. W związku z tym pomijam wyjaśnienie mojego problemu dosłownie, a zamiast tego pokażę trochę (miejmy nadzieję) samoopisującego się kodu. Rozważmy następującą klasę parametryczne:Dlaczego program Eclipse Compiler traci parametr o ustalonym typie?
public class GenericOptional<T> {
public GenericOptional(T someValue) {}
public T getValue() { return null; }
public Optional<String> getOptionalString() { return Optional.empty(); }
}
Co chciałbym podkreślić to, że zwracany typ Optional<String>
metody getOptionalString()
nie zależy na typu parametruT
.
teraz rzucić okiem na poniższy kod, który zostanie skompilowany wewnątrz Luna Eclipse 4.4.2 korzystając Java 8u45:
public static void main(String[] args) {
Object obj = new GenericOptional<>(Boolean.TRUE);
GenericOptional go = (GenericOptional) obj;
Optional os = go.getOptionalString();
}
lokalna zmienna os
ma typ Optional
bez Typu parametrString
! Kompilator Eclipse utracił informacje o ustalonym parametrze typu. Czy ktoś wie, dlaczego?
Spójrzmy teraz na drugim przykładzie kodu:
public static void main(String[] args) {
Object obj = new GenericOptional<>(Boolean.TRUE);
GenericOptional<?> go = (GenericOptional) obj;
Optional<String> os = go.getOptionalString();
}
Deklarując zmienną lokalną go
jak GenericOptional<?>
zwracany typ metody getOptionalString()
teraz jest Optional<String>
jak oczekiwano.
Czy ktoś może wyjaśnić to zachowanie?
Dziękuję za odpowiedź. Kocko udzielił tej samej odpowiedzi i nie wiem, jak udzielić ci prawidłowej/najlepszej aprobaty. W związku z tym, że najpierw odpowiedziałeś na to pytanie, nawet jeśli nie podałeś przykładowego kodu, aby wesprzeć twoje wyjaśnienie, dam ci "najbardziej pomocną" aprobatę. Jeśli uważasz, że odpowiedź Kocko ma większą wartość dla osób, które chcą wiedzieć, jak to działa, pozwól mi nie, a ja przekażę Kocko "najbardziej pomocną" aprobatę. – Harmlezz