gpt4 book ai didi

java:统一处理子类

转载 作者:行者123 更新时间:2023-12-03 19:04:42 25 4
gpt4 key购买 nike

假设我有这个:

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.classDice.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 语言中,这可以通过包含两个元素的结构数组来完成:一个字符串和一个指向函数的指针)。

最佳答案

只有 Command.class类型为 Class<Command> .它的所有子类型都是 Class<? extends Command> 类型.如果将数组和迭代器类型更改为 Class<? extends Command> ,其余代码应该可以工作。

Class<? extends Command>[] commands = {Slice.class,Dice.class};
for (Class<? extends Command> c : commands) {
if (some_string.equals(c.getName()) {
c.getDeclaredMethod("run",String[].class).invoke(argv);
return;
}
}

除非您需要反射,否则使用一组 Command 对象会更简单(这需要删除 run 方法上的 static 关键字):

Command[] commands = {new Slice(), new Dice()};
for (Command cmd : commands) {
if (some_string.equals(cmd.getClass().getName())) {
cmd.run (argv);
return;
}
}

关于java:统一处理子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8233211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com