Использование int в качестве параметра типа для java.util.Dictionary
-
18-09-2019 - |
Вопрос
Когда я пытаюсь объявить словарь как таковой:
private Dictionary<String, int> map;
Компилятор выдает мне следующую ошибку:
Синтаксическая ошибка в токене "int". Размеры ожидаются после этого токена.
Но он отлично работает с Integer
.Я смутно осознаю, что Java лечит int
/ Integer
по-другому (я имею опыт работы с .NET), но я надеялся, что кто-нибудь сможет дать мне полное объяснение, почему я не могу использовать примитивы в словаре <>
Решение
В Java примитивы не являются объектами, поэтому их нельзя использовать вместо объектов.Однако Java автоматически упаковывает/распаковывает примитивы (т. автобокс) в объекты, чтобы вы могли делать такие вещи, как:
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 использует стирание типов, в этом случае для автоупаковки недостаточно информации.
Коллекции Java допускают только ссылки, а не примитивы.Вам нужно использовать классы-оболочки (в данном случае java.lang.Integer), чтобы делать то, что вам нужно:
private Dictionary<String, Integer> map;
с ними вы можете делать такие вещи, как:
int foo = map.get("hello");
и
map.put("world", 42);
а Java использует автоупаковку/распаковку, чтобы выполнить за вас детали преобразования.
Здесь это небольшое описание.
Чтобы расширить ответ TofuBeer.
int - это примитив
Целое число — это объект.
Дженерики не поддерживают примитивы.
@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class)
В этом и заключается хитрость — указать тип, чтобы он работал с примитивами.
В вашем адаптере
использование того же в package-info будет означать, что вы делаете это глобально для этого пакета.
Обнаружил это после экспериментов.
public class MyAdapter extends XmlAdapter<String, Integer> {
Потому что в Java примитивы и есть настоящие примитивы.На Яве int
будет передаваться по значению, а Integer
передаст ссылку.В .NET int или Int32 и т. д.это просто разные имена.