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 и существуют только для обратной совместимости. Вы не должны использовать их.