2015-05-13 3 views
0

Я создаю функцию Java randomize, которая получает один аргумент, массив объектов. В принципе, эта функция рандомизирует весь массив, и поскольку тип данных не имеет значения, сигнатура метода: public static Object[] randomize(Object[] array). Однако это не работает для массивов int, double и т. Д. (Поэтому для массивов примитивов). Как я могу заставить это работать? Я не хочу иметь одну функцию для объектов и 8 перегруженных функций для каждого из примитивных типов. Я могу принять, если есть одна функция для массивов объектов и одна функция для ВСЕХ примитивных типов. Как я могу это сделать?Создание общей функции (для примитивов и объекта)

Спасибо, Гектор

+0

единственный способ иметь один метод типа массива. См. Https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html, который делает это именно так. –

+0

Почему массивы? Почему бы не перечислить? – MadConan

+0

Вы не можете использовать примитивы, обратитесь к http://stackoverflow.com/questions/2721546/why-dont-java-generics-support-primitive-types –

ответ

0

Как вы сказали ИНТ примитив не объект, так что вы можете сделать, это использовать (например) Integer (класс-оболочка для межд), чтобы построить массив целых чисел, это однако вам потребуется сделать это, прежде чем вы вызовете этот метод. Вы можете искать классы-оболочки для получения всех необходимых вам классов.

1

Алгоритм может создать перестановку индексов. Некоторые операции, такие как Arrays.sort, уже доступны на общей базе. Но вообще можно использовать только отражение, которое дорого, когда не манипулирует xxx[].

int[] intArray = new int[10]; 
randomize(intArray); 

void randomize(Object array) { 
    if (array == null || array.getClass().isArray()) { 
     throw new IllegalArgumentException(); 
    } 
    ... use reflection 
} 
0

В качестве последнего средства вы можете объявить метод, используя Object как аргумент для массива, а затем проверить тип во время выполнения. Затем вы можете определить и применить тип массива в методе или использовать какую-либо другую библиотеку утилиты, чтобы сделать это за вас.

1

Можно написать метод, который будет работать на примитивных массивах и опорных массивах, так и без дублирующего кода. Однако вы потеряете безопасность типа. Метод будет принимать и возвращать Object так как это единственный супертипом примитивных массивов и ссылочных массивов:

public static Object randomize(Object array) { 

Затем, внутри метода, вы можете использовать методы из java.lang.reflect.Array класса для выполнения операций на массиве. Вы использовали бы Array.get(), Array.set(), Array.length() для массива вместо операторов доступа к массиву и поля длины. Эти методы работают как для примитивных массивов, так и для ссылочных массивов прозрачно. Если вам необходимо создать новый массив с тем же классом исполнения, как старый, вы можете использовать Array.newInstance() с типом выполнения компонента из переданного в массиве:

Array.newInstance(array.getClass().getComponentType(), N) 
Смежные вопросы