Когда я пытаюсь объявить Словарь как таковой:
private Dictionary<String, int> map;
Компилятор дает мне следующую ошибку:
Синтаксическая ошибка на маркере "интервал", Размеры, ожидаемые после этого маркера
Но это хорошо работает с Integer
. Я неопределенно знаю тот Java обработки int
/ Integer
по-другому (я происхожу из среды.NET), но я надеялся, что кто-то мог дать мне полное объяснение на том, почему я не могу использовать примитивы в Словаре <>
В Java примитивы не являются объектами, поэтому их нельзя использовать вместо объектов. Тем не менее, Java автоматически боксирует/не боксирует примитивы (так же известные как autoboxing) в объекты, так что Вы можете делать такие вещи как:
List<Integer> intList = new LinkedList<Integer>();
intList.add(1);
intList.add(new Integer(2));
...
Integer first = intList.get(0);
int second = intList.get(1);
Но на самом деле это просто компилятор, который автоматически преобразует типы для Вас.
В .Net "примитивные" типы поддерживаются объектами. В Java существует жесткое разграничение между примитивными типами и Объектами. В Java 5 введен автобоксинг, который в определенных ситуациях может принуждать к сотрудничеству. Однако, поскольку в системе Java generics используется определение типа, то информации для автобокса в данном случае недостаточно.
.Java-коллекции допускают только ссылки, а не примитивы. Вам нужно использовать классы-обёртки (в данном случае java.lang.Integer), чтобы делать то, что вам нужно:
private Dictionary<String, Integer> map;
они могут делать такие вещи, как:
int foo = map.get("hello");
и
map.put("world", 42);
а Java использует автобоксинг/разборку для работы с деталями преобразования для вас.
Здесь даётся небольшое описание.
.Расширить ответ Тофу Бира.
int - примитив
Целочисленное - это Объект.
Дженерика не поддерживает примитивы.
Потому что на Java примитивы действительно примитивы. В Java int
будет проходить по значению, а Integer
- по ссылке. В .NET int или Int32 и т.д. просто разные имена.