Использование int как параметра типа для java.util.Dictionary
Когда я пытаюсь объявить словарь как таковой:
private Dictionary<String, int> map;
Компилятор дает мне следующую ошибку:
Синтаксическая ошибка в токене "int", размеры, ожидаемые после этого токена
Но он отлично работает с Integer
. Я смутно знаю, что Java рассматривает int
/Integer
по-другому (я исхожу из фона .NET), но я надеялся, что кто-то сможет дать мне полное объяснение, почему я не могу использовать примитивы в словаре < >
Ответы
Ответ 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 и т.д. Это просто разные имена.