Компилятор не Infer типа, потому что вы инстанцировании сыройArrayList
. Но он достаточно умен, чтобы предупредить вас, что при работе с этим (необработанным) объектом могут возникнуть проблемы.
Следует упомянуть причину этого предупреждения. Из-за type erasure параметрическая информация (<Integer>
) о List
полностью исчезнет во время выполнения, когда переменная будет содержать элементы типа Object
. Рассмотрим этот фрагмент:
List rawList = new ArrayList(); //raw list
rawList.add(new String("hello"));
rawList.add(new Double(12.3d));
List<Integer> intList = rawList; // warning!
Этот фрагмент будет скомпилирован, но будет генерировать несколько предупреждений. Имея необработанный список (rawList
), вы можете добавить в список любой непримитивный тип, включая String
, Double
и т. Д. Но при назначении этой коллекции списку, который указан для целых чисел , то это проблема. В Runtime вы получите ClassCastException
при попытке получить некоторый элемент из intList
, который должен быть Integer
, но на самом деле это String
или что-то еще.
Короткий рассказ длинного - не смешивать сырые типы с дженериками!
В вашем случае, компилятор , возможно, бы выводил тип, если вы использовали алмаз:
List<Integer> list = new ArrayList<>(); //¯\_(ツ)_/¯
↑↑
Почему это дает компилятору больше информации, чем список MyList = новый ArrayList(), так как на левой стороне родовой информации Availabe –
PKuhn
Поскольку оба семантический различны. Опущение типа в алмазе - это просто синтаксическая идея. – lschuetze