Mam funkcję:Dlaczego symbol wieloznaczny w parametrze generycznym wymaga jawnego rzutowania?
<T> T get(Class<T> fetchType) {
...
}
Więc jeśli miałbym zrobić coś takiego:
String x = get(String.class);
To wszystko jest dobre.
Jednak w innej funkcji:
<R> R otherFunction(R base) {
return get(base.getClass());
}
daje mi błąd, ponieważ base.getClass()
powraca ? extends R
.
reason: no instance(s) of type variable(s) exist so that capture of ? extends Object conforms to R
inference variable T has incompatible bounds:
equality constraints: capture of ? extends Object upper bounds: Object, R
Teraz z tego co rozumiem, funkcja get(Class<T> x)
zwrotów T
, więc kiedy zwanych z ? extends R
, który powiedzmy jest CAP#1
, ale ponieważ get
teraz powraca CAP#1
, przypisując go wpisywać R
nie powinno być problemem. Aby przetestować to, próbowałem:
Class<? extends CharSequence> stringClass = String.class;
CharSequence x = get(stringClass);
To wydaje się działać bez żadnych problemów. Co idzie źle?
EDYTOWANIE: Czy to z powodu usuwania typu, że w czasie wykonywania nie ma informacji o R
, ale CharSequence
jest? Co nadal nie ma sensu, ponieważ nie jest to sprawdzane wyłącznie podczas fazy kompilacji?
więc okazuje się, że Object.getClass()
powraca Class<? extends |X|>
a nie Class<? extends X>
, gdzie |X|
jest wymazanie X
dlatego, że pracuje dla konkretnych typów (jak ? extends CharSequence
, ale nie dla typu rodzajowego). IntelliJ prawdopodobnie nie zgłasza tego dokładnie, co spowodowało zamieszanie: (Próbowałem zrobić zrzut ekranu, ale okno pop-up ciągle znikało).
Pokaż nam kontekst, w którym pojawia się ten błąd. Czy jest to kompilacja 'otherFunction' lub próba wywołania go? Jeśli to drugie, dodaj kod, który go wywołuje. – RealSkeptic
Twój błąd mówi, że 'getClass()' zwraca '? extends Object', kompilator nie może go rozwiązać na '? przedłuża R'. – Codebender
Również, która wersja Java? Java 8 ma lepsze wnioskowanie o typie niż Java 7. – RealSkeptic