Kompilator nie wywnioskować typ, bo jesteś uruchamianiu tego surowegoArrayList
. Ale jest wystarczająco inteligentny, aby ostrzec cię, że mogą wystąpić problemy podczas pracy z tym (surowym) obiektem.
Warto wspomnieć o przyczynie tego ostrzeżenia. Z powodu type erasure, parametryczna informacja (<Integer>
) o wartości List
zniknie całkowicie w środowisku wykonawczym, gdy zmienna będzie zawierać elementy typu Object
. Rozważ ten fragment:
List rawList = new ArrayList(); //raw list
rawList.add(new String("hello"));
rawList.add(new Double(12.3d));
List<Integer> intList = rawList; // warning!
Ten fragment zostanie skompilowany, ale wygeneruje kilka ostrzeżeń. Mając listę nieprzetworzoną (rawList
), można dodać do listy dowolny typ niepochowany, w tym String
, Double
itp. Jednak przy przypisywaniu tej kolekcji do listy, która jest określona jako liczba całkowita o wartości , jest ona liczbą całkowitą. problem. W środowisku wykonawczym otrzymasz kod ClassCastException
podczas próby pobrania elementu z intList
, który ma być Integer
, ale w rzeczywistości jest to String
lub coś innego.
Krótka historia - Nie mieszaj surowych typów z generics!
W twoim przypadku, kompilator byłoby ewentualnie zostały wywnioskować typ, jeśli użyłeś diament:
List<Integer> list = new ArrayList<>(); //¯\_(ツ)_/¯
↑↑
Dlaczego to dać kompilator więcej informacji niż Lista mylist = new ArrayList(), ponieważ po lewej stronie jest informacja generic dostępnej –
PKuhn
Ponieważ oba są semantycznie różne. Pominięcie typu w bryle to tylko sugestia syntaktyczna. – lschuetze