List<String> list = new ArrayList();
spowoduje ostrzeżenie kompilatora.Dlaczego operator diamentów jest używany do wnioskowania typu w Java 7?
jednak następujący przykład kompiluje bez ostrzeżenia: List<String> list = new ArrayList<>();
Jestem ciekaw dlaczego wprowadzenie wykonawcy diament jest w ogóle potrzebne. Dlaczego po prostu nie mają typu wnioskowanie na konstruktora jeśli typ argumentu jest nieobecny (jak sama już zrobione dla metody statyczne w Javie i eksploatowane przez biblioteki zbiórki takich jak Google guawa)
EDIT: Korzystanie odpowiedź millimoose jako punkt wyjścia Spojrzałem jaki typ jest w rzeczywistości wymazaniem, a nie tylko usunięcie wszystkich informacji o typie. Kompilator faktycznie robi nieco więcej (skopiowane z official doc):
- Wymień wszystkie parametry typu typów generycznych z ich granicach lub obiektu, jeśli parametry typu są nieograniczone. Powstały kod bajtowy zawiera zatem tylko zwykłe klasy, interfejsy i metody.
- Wstawić odlewy w razie potrzeby, aby zachować bezpieczeństwo typu.
- Generowanie metod mostkowania w celu zachowania polimorfizmu w rozszerzonych typach ogólnych.
Ja zakładając, że rozróżnienie to z użyciem surowych rodzajów, które sprawiają, że kompilator coś zrobić całkowicie odmienne ze względu na kompatybilność. (Wyrażenie z surowym typem jest przetwarzane inaczej niż w przypadku generycznych.) – millimoose
Prawdopodobnie zgodziłbym się z millimoose, ale biorąc pod uwagę, że generics są usuwane podczas wykonywania przez środowisko wykonawcze, wprowadzając nowego operatora ('tylko') dla wstecznej kompatybilności ostrzeżenia kompilatora nie czuje się dobrze. –
Kompatybilność wsteczna nie jest ze względu na ostrzeżenia kompilatora. Wyrażenie takie jak 'Object s = new ArrayList(). Get()' ma typ wyniku po stronie prawej, rozwiązany inaczej (przy użyciu algorytmu pre-generics) niż wypowiedź 'String s = new ArrayList() .get() '. Dotyczy to również zapisu 'ArrayList' w zmiennej pośredniej. –
millimoose