Подтвердить что ты не робот

Использование int как параметра типа для java.util.Dictionary

Когда я пытаюсь объявить словарь как таковой:

private Dictionary<String, int> map;

Компилятор дает мне следующую ошибку:

Синтаксическая ошибка в токене "int", размеры, ожидаемые после этого токена

Но он отлично работает с Integer. Я смутно знаю, что Java рассматривает int/Integer по-другому (я исхожу из фона .NET), но я надеялся, что кто-то сможет дать мне полное объяснение, почему я не могу использовать примитивы в словаре < >

4b9b3361

Ответ 1

В Java примитивы не являются объектами, поэтому вы не можете использовать их вместо объектов. Тем не менее, Java автоматически добавит примитивные элементы box/unbox (aka 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);

Но это действительно просто компилятор, автоматически конвертирующий типы для вас.

Ответ 2

В .Net "примитивные" типы поддерживаются объектами. В Java существует жесткое различие между примитивными типами и объектами. Java 5 представила автобоксинг, который может принуждать между ними в определенных ситуациях. Однако, поскольку в системе generic Java используется стирание типа, в этом случае недостаточно информации для автобокса.

Ответ 3

Сборники Java позволяют ссылаться на не примитивы. Вам нужно использовать классы-оболочки (в данном случае java.lang.Integer) для выполнения следующих действий:

private Dictionary<String, Integer> map;

они могут делать такие вещи, как:

int foo = map.get("hello");

и

map.put("world", 42);

и Java использует autoboxing/unboxing для обработки деталей преобразования для вас.

Здесь это небольшое описание.

Ответ 4

Чтобы расширить ответ TofuBeer.

int является примитивным

Целое - это объект.

Generics не поддерживает примитивы.

Ответ 5

@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class)

Вот трюк, указывающий тип, чтобы заставить его работать с примитивами

В адаптере

используя то же самое в package-info, будет означать, что вы делаете это глобально для этого пакета

Обнаружено это после эксперимента.

public class MyAdapter extends XmlAdapter<String, Integer> {

Ответ 6

Потому что в Java примитивы являются истинно примитивными. В Java int пройдет по значению, а Integer передаст ссылку. В .NET int или Int32 и т.д. Это просто разные имена.