Как мы можем работать с универсальными типами и примитивами в Java

#java #templates #generics #types #primitive

#java #шаблоны #универсальные #типы #примитив

Вопрос:

У меня есть объект, который содержит массив, но тип массива каждый раз будет отличаться.

Я мог бы сделать что-то вроде

 class MyObject<T>
{
    public T [] data;
}
  

Дело в том, что это не работает с примитивными типами (int, double, …) и это заставляет меня работать с объектами (Integer, Double …).

Есть ли какой-либо способ избежать этого?

Спасибо в adavnce

Ответ №1:

Вы должны знать, что автоматическая упаковка в Java может делать именно то, что вы ищете. Смотрите этот пример кода по ссылке:

 // List adapter for primitive int array
public static List<Integer> asList(final int[] a) {
    return new AbstractList<Integer>() {
        public Integer get(int i) { return a[i]; }
        // Throws NullPointerException if val == null
        public Integer set(int i, Integer val) {
            Integer oldVal = a[i];
            a[i] = val;
            return oldVal;
        }
        public int size() { return a.length; }
    };
}
  

Этот get() метод возвращает простой старый тип данных, int который автоматически преобразуется в Integer . Аналогично, set() метод принимает Integer и присваивает int элемент в массиве.

Автоматическая упаковка не является очевидной функцией, но она обрабатывает автоматическое создание объекта.

Ответ №2:

Вы не можете использовать примитивы в generics, как вы можете в C с шаблонами.

Если вам нужна коллекция, использующая примитивы, я предлагаю вам взглянуть наhttp://trove.starlight-systems.com/Вы можете передать этот тип коллекции как часть универсального. т.е. вместо передачи примитивного типа передайте тип коллекции.

 MyObject<List<String>> containsStrings = ...
MyObject<TIntArrayList> contains_ints = ...
  

Ответ №3:

Это невозможно. Преобразуйте примитивные массивы в их эквиваленты OO.