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

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

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

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

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

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

Заранее спасибо


person Bara    schedule 06.05.2011    source источник


Ответы (3)


Вы должны знать, что автоматическая упаковка в 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 в массиве.

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

person Bob Cross    schedule 06.05.2011

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

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

MyObject<List<String>> containsStrings = ...
MyObject<TIntArrayList> contains_ints = ...
person Peter Lawrey    schedule 06.05.2011

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

person johnstok    schedule 06.05.2011