Как в метод передать объект неизвестного типа? Имеем интерфейс:public interface Sorter { void sort(Integer[] array); } И несколько классов, имплементирующих данный интерфейс:public class BubbleSort implements Sorter{...} public class MergeSort implements Sorter{...} public class QuickSort implements Sorter {...} public class ShellSort implements Sorter{...} Хочу написать класс для тестирования скорости работы алгоритмов, нем описать метод, скажем testSortMethod, который принимал бы любой из объектов класса, описанных выше и вызывал бы у них метод sort . Желательно это делать в цикле, то есть положить все объекты в массив и по очереди передавать их методу testSortMethod. Реально ли это сделать и как?
Да, это возможно сделать с помощью использования рефлексии в Java. В методе testSortMethod вы можете передать объект типа Sorter и вызвать метод sort для этого объекта, не зная его конкретного класса. Вот пример реализации такого метода:
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class SortTester { public void testSortMethod(Sorter sorter) { Integer[] array = {4, 2, 5, 1, 3}; // Пример массива, который будет сортироваться try { Method sortMethod = sorter.getClass().getMethod("sort", Integer[].class); sortMethod.invoke(sorter, (Object)array); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); } } public static void main(String[] args) { Sorter[] sorters = {new BubbleSort(), new MergeSort(), new QuickSort(), new ShellSort()}; SortTester tester = new SortTester(); for (Sorter sorter : sorters) { tester.testSortMethod(sorter); } } }
В этом примере мы создали метод testSortMethod, который принимает объект типа Sorter и использует рефлексию для вызова метода sort этого объекта. В методе main мы создаем массив объектов, имплементирующих Sorter, и вызываем testSortMethod для каждого из них.
Да, это возможно сделать с помощью использования рефлексии в Java. В методе testSortMethod вы можете передать объект типа Sorter и вызвать метод sort для этого объекта, не зная его конкретного класса. Вот пример реализации такого метода:
import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;
public class SortTester {
public void testSortMethod(Sorter sorter) {
Integer[] array = {4, 2, 5, 1, 3}; // Пример массива, который будет сортироваться
try {
Method sortMethod = sorter.getClass().getMethod("sort", Integer[].class);
sortMethod.invoke(sorter, (Object)array);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Sorter[] sorters = {new BubbleSort(), new MergeSort(), new QuickSort(), new ShellSort()};
SortTester tester = new SortTester();
for (Sorter sorter : sorters) {
tester.testSortMethod(sorter);
}
}
}
В этом примере мы создали метод testSortMethod, который принимает объект типа Sorter и использует рефлексию для вызова метода sort этого объекта. В методе main мы создаем массив объектов, имплементирующих Sorter, и вызываем testSortMethod для каждого из них.