Java Object.toString()是否显示了错误的类?
我在调试一些代码时遇到了一个奇怪的问题 以下是我用来测试某些东西的相关信息(我们不关心我测试什么): 在这里,调试窗口显示的内容如下: 正如我在SimpleCommand.class实例上调用toString()时所看到的 它表明给定的对象实际上是一个BattleInteractionMachine.class(BIM)。这应该很明显,但我想指定我没有从Object.class重写toString方法 然而,这两个类之间并不相关 SimpleCommand内在树:SimpleCommandJava Object.toString()是否显示了错误的类?,java,tostring,Java,Tostring,我在调试一些代码时遇到了一个奇怪的问题 以下是我用来测试某些东西的相关信息(我们不关心我测试什么): 在这里,调试窗口显示的内容如下: 正如我在SimpleCommand.class实例上调用toString()时所看到的 它表明给定的对象实际上是一个BattleInteractionMachine.class(BIM)。这应该很明显,但我想指定我没有从Object.class重写toString方法 然而,这两个类之间并不相关 SimpleCommand内在树:SimpleCommand
你知道怎么会这样吗?我并不寻求我的案例的具体答案,而是对这个问题如何产生的一般理解。从
命令返回的对象。peek()
不是BattleInteractionMachine
对象
您错过了显示名称的$3
部分,该部分是返回对象的类名的一部分。@
符号前面的任何内容都是完全限定的类名
$
和数字后缀表示该对象是BattleInteractionMachine
类中定义的匿名类的实例
数字3表示BIM至少声明了另外两个匿名类,因为编号通常以1开头。如果您可以在文件系统或.jar
文件中看到BattleInteractionMachine.class
,您还可以看到其他BattleInteractionMachine$XXX.class
文件,其中XXX可以是一个数字、一个名称或更复杂的东西
例如,类似这样的事情:
class BattleInteractionMachine {
// ...
void somemethod() {
// ...
SimpleCommand command = new SimpleCommand() {
// methods here
}
// ...
}
// ...
}
这是无法回避的<代码>战斗交互机器必须覆盖
toString()
。您可以添加一些奇特的反射代码来断言所有命令都实现它们自己的toString()
,但是我建议不要这样做。试着创建一个和你的问题。如何定义和填充命令我猜简单命令和它的层次结构都是接口,在某种程度上它是在战机交互机的层次结构中实现的,否则代码就无法编译,否则会出现类强制转换异常。事实上,变量命令被声明为SimpleCommand
并没有说明引用的对象到底是什么。它可以是扩展或实现SimpleCommand
的任何内容。重要的是,commands.peek()
真正返回的是什么。谢谢!!我注意到,如果SimpleCommand实例不是匿名类,那么toString()方法可以识别我的类的实例,但我没有注意到$3。现在你的回答清楚了原因!
class BattleInteractionMachine {
// ...
void somemethod() {
// ...
SimpleCommand command = new SimpleCommand() {
// methods here
}
// ...
}
// ...
}