Предположим, у меня есть это:
abstract class Command {
static void run (String[]argv) {}
}
class Slice extends Command {
static void run (String[]argv) {/* slicing code */}
}
class Dice extends Command {
static void run (String[]argv) {/* dicing code */}
}
Я хочу иметь возможность перебирать команды, поэтому я написал:
Class<Command>[] commands = {Slice.class,Dice.class}; /* compile error */
for (Class<Command> c : commands) {
if (some_string.equals(c.getName()) {
c.getDeclaredMethod("run",String[].class).invoke(argv);
return;
}
}
однако, похоже, что Slice.class
и Dice.class
нельзя поместить в тот же контейнер, что и Class<Command>
.
Если я заменю Class<Command>
на Class
везде, код скомпилируется с одним предупреждением:
[unchecked] unchecked call to getDeclaredMethod(java.lang.String,java.lang.Class<?>...) as a member of the raw type java.lang.Class
c.getDeclaredMethod("run",String[].class).invoke(argv);
что, конечно, можно подавить, но, интересно, есть ли более элегантное решение?
(Конечно, в C это можно было бы сделать с помощью массива структур с двумя элементами: строкой и указателем на функцию).