#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.