Использование int в качестве параметра типа для java.util.Dictionary - PullRequest
34 голосов
/ 04 января 2010

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

private Dictionary<String, int> map;

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

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

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

Ответы [ 6 ]

40 голосов
/ 04 января 2010

В 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);

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

9 голосов
/ 04 января 2010

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

5 голосов
/ 04 января 2010

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

private Dictionary<String, Integer> map;

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

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

и

map.put("world", 42);

и Java использует автоматическую коробку / распаковку, чтобы иметь дело с деталями преобразования для вас.

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

1 голос
/ 31 мая 2011
@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class)

Эта хитрость указывает тип, чтобы он работал с примитивами

В вашем адаптере

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

Нашел это после экспериментов.

public class MyAdapter extends XmlAdapter<String, Integer> {
1 голос
/ 04 января 2010

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

int - это примитив

Целое число - это объект.

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

0 голосов
/ 04 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...