为什么 "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,所以当反射搜索注释时,在 FireballSpell 中找到的注释都被找到。

Generally speaking, since this refers to the current instance, how is it possible that Fireball.onChat(PlayerChatEvent) is registered too?

因为当您构造 Fireball 的实例时,this 指的是在执行时构造的 Fireballthiscompile-time 类型是 Spell,但是如果你打印出 this.getClass()(甚至在 Spell 构造函数中)它将显示 Fireball.

因此,如果 registerEvents 正在查看对象的执行时类型并使用反射查找事件处理程序,它将看到 onChat

Fireball.onChat(PlayerChatEvent) 也被注册了,因为你使用了 super(),它调用了 superclass.

的构造函数

this 总是从调用它的地方引用 class 的实例。

由于不存在的构造函数与您在 Fireball 中使用的构造函数等价 class,您应该能够省略 Fireball 构造函数而不影响结果。

所以最后在每个 subclass 的 spell 中的每个 @EventHandler 注释方法都被注册了。