我写了一些代码,我所做的只是循环,但改变了我调用的方法。我尝试使用for循环,所以它有点整洁(出于好奇,看看是否可以完成),但是当我这样做时它不会编译,因为它无法识别一个项目我想,数组作为一种方法。这就是我所拥有的:
String[] moveArray = {moveRight,moveDown,moveLeft,moveUp};
for (i = 0; i < 4; i++) {
while (myWumpus.moveArray[i]) {
myWumpus.moveArray[i];
generator.updateDisplay();
}
}
当我尝试编译时,我得到了
not a statement myWumpus.moveArray[i]();
';' expected myWumpus.moveArray[i]();
(它指的是while循环中的第一个语句)
所以,我认为这可能是因为我正在使它成为String类型的数组?有类型方法吗?这是可能吗?任何解决方案欢迎:)。此外,我可以使用4 while循环来使其工作,因此您无需向我展示该解决方案。谢谢!
答案 0 :(得分:14)
您无法直接在数组中存储方法。但是,您可以存储以不同方式实现相同方法的对象。例如:
Mover[] moveArray = {new RightMover(), new DownMover() new LeftMover(), new UpMover() };
for (i = 0; i < 4; i++) {
while (myWumpus.moveArray[i]) {
moveArray[i].move();
generator.updateDisplay();
}
}
答案 1 :(得分:5)
您无法在Java中的数组中存储方法,因为方法不是Java中的第一类对象。这是一些人喜欢使用Python,Scheme等其他语言的原因。
解决方法是创建一个包含一个方法的接口,然后创建实现该接口的四个类 - MoveRight,MoveLeft等......类。然后,您可以在数组中存储这些类的实例,并以相同的方式调用它们。
答案 2 :(得分:5)
是的,你可以使用Reflection将方法存储在数组中,但是在这种情况下你真正想要做的事情可能就是使用polymorphism。
作为与您的问题相关的多态性的一个例子 - 假设您创建了一个接口,如下所示:
public interface MoveCommand {
void move();
}
然后您可以按如下方式创建实现:
public class MoveLeftCommand implements MoveCommand {
public void move() {
System.out.println("LEFT");
}
}
等。对于其他移动选项。然后,您可以将它们存储在MoveCommand[]
或像List<MoveCommand>
这样的集合中,然后遍历调用每个元素上的move()的数组/集合,例如:
public class Main {
public static void main(String[] args) {
List<MoveCommand> commands = new ArrayList<MoveCommand>();
commands.add(new MoveLeftCommand());
commands.add(new MoveRightCommand());
commands.add(new MoveLeftCommand());
for (MoveCommand command:commands) {
command.move();
}
}
}
多态性非常强大,以上是一个非常简单的例子Command Pattern。享受Wumpus World实施的其余部分:)
答案 3 :(得分:4)
您无法调用此类方法。但你可以使用反射:
只需将while循环中的第一行更改为:
Method m = myWumps.getClass().getMethod(moveArray[i]); // if the method is void
m.invoke(myWumps);
(你必须声明/捕捉一些例外)
但你最好避免反思,而是改用Command pattern。
答案 4 :(得分:0)
Java 8及更高版本的更新答案-
由于Java 8中引入了lambda expressions和method references,现在可以在变量中存储各种方法。一个主要问题是arrays don't currently support generic objects in Java,这使得在数组中存储方法的可行性降低。但是,它们可以存储在其他数据结构中,例如List
。
因此,对于一些简单的示例,您可以编写如下内容:
List<Comparator<String>> stringComparators = new ArrayList<>();
Comparator<String> comp1 = (s1, s2) -> Integer.compare(s1.length(), s2.length());
stringComparators.add(comp1);
或
List<Consumer<String>> consumers = new ArrayList<>();
Consumer<String> consumer1 = System.out::println;
consumers.add(consumer1);
,然后循环/迭代List
以获取方法。