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

StackOverflow https://stackoverflow.com/questions/2001755

  •  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 и т. д.это просто разные имена.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top