VAR не дает предупреждение для универсального

В Java 10 это дает мне предупреждение -

ArrayList a = new ArrayList<>();
a.add(23);
a.add("str");

"ArrayList является необработанным типом. Ссылки на универсальный тип ArrayList должны быть параметризованы"

И причина здесь общая, но для этого кода

var b = new ArrayList<>();//Object type
b.add(3);
b.add("string");

Почему какое-либо предупреждение не было дано компилятором?

Примечание:- Я знаю var ограничивается областью применения метода. Просто хотел узнать концепцию дизайна резектированного к дженерикам для вар

Edit1:- Не отмечайте как дубликат, как я только хотел знать о внутреннем дизайне и почему java не добавил общие вещи для var?

2 ответа

Решение

Вот как компилятор вычисляет тип

var b = new ArrayList<>();

Он начинается с вычисления автономного типа инициализатора. Поскольку инициализатор является алмазным вызовом, мы должны использовать логический вывод. Итак, мы вводим переменную логического вывода alphaи тип на RHS является ArrayList<alpha>, Теперь мы должны решить для alpha,

Чтобы решить, мы собираем ограничения. Начнем с изначального ограничения, что alpha <: Object (потому что все переменные типа являются ссылочными типами). Затем мы смотрим на аргументы конструктора (ничего там) и целевой тип (ничего там), чтобы собрать ограничения. Таким образом, единственное ограничение у нас есть alpha <: Objectи так выбираем alpha=Object, и получить ArrayList<Object> на RHS. Это тип b,

Здесь нет необработанного типа, следовательно, нет предупреждения.

Потому что это ArrayList<Object>, Object это тип верхнего уровня в Java, который представляет любой тип, поэтому всегда безопасно добавлять что-либо в список.

В первом примере вы получили предупреждение, потому что вы использовали необработанный тип. Необработанные типы унаследованы в Java и существуют только для обратной совместимости. Вы не должны использовать их.

Другие вопросы по тегам