我在调试一些代码时遇到了一个奇怪的问题。
下面是我用来测试的相关代码(我们并不关心我测试的是什么):
private void launch(){
System.out.println("DIAGNOSIS ");
System.out.println("commands size: "+commands.size());
System.out.println("commands top element: "+commands.peek());
SimpleCommand command = commands.peek();
System.out.println("simple command peek :"+command);
if(!isEmpty()) {
commands.peek().apply();
countDown.reset(delays.peek());
countDown.run();
}
}
在这里,调试窗口向我展示了:
正如您所看到的,当我在SimpleCommand.class的一个实例上调用toString()时,它显示给定的对象实际上是一个BattleInteractionMachine.class (BIM)。这应该很明显,但是我想指定我还没有覆盖Object.class中的toString方法
然而,这两个类并不相关。
SimpleCommand继承树: SimpleCommand <命令<对象
BIM继承树: BIM < MachineState < Object
我完全不知道这是怎么回事...你知道这是怎么发生的吗?对于我的案例,我并不寻求一个具体的答案,而是寻求一个关于这个问题如何产生的一般理解。
发布于 2018-08-26 07:41:12
从commands.peek()
返回的对象不是BattleInteractionMachine
对象。
您缺少显示名称的$3
部分,它是返回对象的类名的一部分。在@
符号之前的任何内容都是完全限定的类名。
$
和number后缀表示该对象是在类中定义的匿名类BattleInteractionMachine
的实例。
数字3表示BIM至少声明了另外两个匿名类,因为编号通常从1开始。如果您可以在文件系统或.jar
文件中看到BattleInteractionMachine.class
,您还会看到其他BattleInteractionMachine$XXX.class
文件,其中XXX可以是数字、名称或更复杂的内容。
例如,就像这样:
class BattleInteractionMachine {
// ...
void somemethod() {
// ...
SimpleCommand command = new SimpleCommand() {
// methods here
}
// ...
}
// ...
}
https://stackoverflow.com/questions/52021683
复制相似问题