在Java中扩展一个通用类型

3

在Java中,是否可以让一个类扩展一个泛型类型,以便您可以将方法注入通过您的代码传递的任何类?(或者是否有任何其他方式将方法注入或覆盖现有类的方法?)

我所说的“扩展泛型类型”是指像这样(类“T extends GameObject”属于游戏,不得更改并且未知,因为在运行时从其他模块加载到游戏中):

class GameObject {
    void moveForward(float amount) {
        this.camera.z += amount;
    }
}

class Extender<T extends GameObject> extends T {
    void onTick(float time) {
        this.camera.z -= amount;
    }
}

onTick是由GameEngine调用的,通过这种方式,我可以将每个现有的游戏对象替换为在每个滴答声后向后移动的版本。


1
你能举个例子来说明如何使用它吗? - assylias
游戏模组(Minecraft):您想覆盖/注入方法到现有的方块中,以改变其行为,而无需更改游戏文件(出于兼容性原因)。 - th3falc0n
1
我的意思是:你能展示一个可以从这个特性中受益的代码示例吗? - assylias
我真的不明白这两个问题(一方面是注入代码,另一方面是扩展通用类型)之间有什么联系。即使 class Extender <T> extends T 起作用了,它也是无用的,因为你不能在你的类 Extender 中使用任何成员字段或方法 T(因为 T 可以是任何东西,没有成员被保证存在)。如果你实际上只是在问注入代码的问题,我建议你重新表达你的问题,避免误导性地认为你想扩展通用类型。 - us2012
聚合优于继承?您可以创建一个具有T并实现相同接口的类Extender...装饰器模式,我猜?但是那个成员也可以被定义为接口本身而不是T... - Fildor
显示剩余2条评论
2个回答

8
不行。您不能扩展通用超类型。您可以扩展使用通用类型的类(例如,public class MyClass<T> extends TheirClass<T>),但是您不能扩展纯通用类型。

2
我知道代码是错误的,问题是是否有其他方法可以做到这一点! - th3falc0n
@Mike 你认为装饰器模式可能是一个可行的替代方案吗? - Fildor

0
在我看来,你可以找到解决方案不在语言的特性中,而是在一些设计模式中,比如装饰器模板方法模式
如果行为在运行时确定,你可以看看行为模式

问题在于我只能影响Extender类,而无法影响其他任何东西。如果我有完整的代码,我知道如何做到这一点,但在这种情况下,我必须编辑一个已经存在的类(而且我不能更改该类)。 - th3falc0n

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接