W poniższym przykładzie metoda foo
podaje ostrzeżenie, natomiast bar
nie?Ostrzeżenie dotyczące dziedziczenia generycznego języka Java
public class X {
static class Y {}
static class Z extends Y {}
Y y = new Y();
<T extends Y> T foo() {
return (T) y; // warning - Unchecked cast from X.Y to T
}
Z bar() {
return (Z) y; // compiles fine
}
}
Ile wiesz o wymazywaniu typu? Zobacz http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#Type Erasure –
Myślę, że jest jasne, że 'foo()' powinno dać ostrzeżenie. Rzucasz obiekt 'y' do jakiejś nieznanej nadklasy' T' z 'Y'. Jestem również bardzo zainteresowany tym, dlaczego 'bar()' nie. Domyślam się, że kompilator może zobaczyć, że rzutowanie 'Y' na' Z' nie powoduje problemów, ponieważ dostępna jest definicja 'Z'. – SebastianH
@SebastianH: Nie sądzę, że to problem. – gudge