为什么 "this" 关键字也引用子类?
Why does the "this" keyword refer to the subclass too?
在以下场景中,Main.registerEvents(Listener)
是游戏 API 事件系统的一部分。
假设它应该使用 @EventHandler
注释注册任何方法。
public abstract class Spell implements Listener {
protected Spell() {
Main.getInstance().registerEvents(this);
}
@EventHandler
public void onMove(PlayerMoveEvent event) {
}
}
public class Fireball extends Spell {
@EventHandler
public void onChat(PlayerChatEvent event) {
}
}
一般来说,既然this
指的是当前实例,怎么可能Fireball.onChat(PlayerChatEvent)
也被注册了呢?
不知道API的实现,我只能猜测。
为了获得注解,首先必须使用Object.getClass()
获得适用的class。这是多态的,所以它 returns Fireball.class
,所以当反射搜索注释时,在 Fireball
和 Spell
中找到的注释都被找到。
Generally speaking, since this refers to the current instance, how is it possible that Fireball.onChat(PlayerChatEvent) is registered too?
因为当您构造 Fireball
的实例时,this
指的是在执行时构造的 Fireball
。 this
的 compile-time 类型是 Spell
,但是如果你打印出 this.getClass()
(甚至在 Spell
构造函数中)它将显示 Fireball
.
因此,如果 registerEvents
正在查看对象的执行时类型并使用反射查找事件处理程序,它将看到 onChat
。
Fireball.onChat(PlayerChatEvent)
也被注册了,因为你使用了 super()
,它调用了 superclass.
的构造函数
this
总是从调用它的地方引用 class 的实例。
由于不存在的构造函数与您在 Fireball 中使用的构造函数等价 class,您应该能够省略 Fireball 构造函数而不影响结果。
所以最后在每个 subclass 的 spell 中的每个 @EventHandler
注释方法都被注册了。
在以下场景中,Main.registerEvents(Listener)
是游戏 API 事件系统的一部分。
假设它应该使用 @EventHandler
注释注册任何方法。
public abstract class Spell implements Listener {
protected Spell() {
Main.getInstance().registerEvents(this);
}
@EventHandler
public void onMove(PlayerMoveEvent event) {
}
}
public class Fireball extends Spell {
@EventHandler
public void onChat(PlayerChatEvent event) {
}
}
一般来说,既然this
指的是当前实例,怎么可能Fireball.onChat(PlayerChatEvent)
也被注册了呢?
不知道API的实现,我只能猜测。
为了获得注解,首先必须使用Object.getClass()
获得适用的class。这是多态的,所以它 returns Fireball.class
,所以当反射搜索注释时,在 Fireball
和 Spell
中找到的注释都被找到。
Generally speaking, since this refers to the current instance, how is it possible that Fireball.onChat(PlayerChatEvent) is registered too?
因为当您构造 Fireball
的实例时,this
指的是在执行时构造的 Fireball
。 this
的 compile-time 类型是 Spell
,但是如果你打印出 this.getClass()
(甚至在 Spell
构造函数中)它将显示 Fireball
.
因此,如果 registerEvents
正在查看对象的执行时类型并使用反射查找事件处理程序,它将看到 onChat
。
Fireball.onChat(PlayerChatEvent)
也被注册了,因为你使用了 super()
,它调用了 superclass.
this
总是从调用它的地方引用 class 的实例。
由于不存在的构造函数与您在 Fireball 中使用的构造函数等价 class,您应该能够省略 Fireball 构造函数而不影响结果。
所以最后在每个 subclass 的 spell 中的每个 @EventHandler
注释方法都被注册了。