我的主要问题是如果将通用对象扩展为例如2,则我是否可以将两个通用对象绑定在一起4种。没有一个例子,我真的不知道如何问这个问题。
因此,我创建了一个简单的游戏示例,其中勇士或游骑兵可以装备不同类型的武器(OneHanded,TwoHanded,Melee,Ranged)。每个武器都有两个属性。因此,例如武器类型Dagger extends Weapon implements OneHanded, Melee
。
游侠类(可以使用双手远程武器):
private Weapon weapon;
public <T extends TwoHanded & Ranged> void equip(T weapon) {
this.weapon = (Weapon) weapon;
}
战士等级(可以使用单手,两手,近战,远程武器):
private Weapon weapon;
public <T extends OneHanded & Melee & Ranged> void equip(T weapon) { //probably have to do this differently
this.weapon = (Weapon) weapon;
}
弓箭匕首类:
public class Bow extends Weapon implements TwoHanded, Ranged {}
public class Dagger extends Weapon implements OneHanded, Melee {}
public void equipTest() {
ranger.equip(bow); //works fine
warrior.equip(dagger); //does not work
}
这里的主要问题是(我认为)我不知道如何实现,战士可以为不同的武器装备不同的属性(例如弓(远射,双手)或匕首(近战,单手)),而护林员只有一种可能性。如何解决此问题?
最佳答案
该代码无法编译,因为Dagger
没有实现Ranged
。
我认为您的意思是Melee
或Ranged
。这可以写为重载。
<T extends Melee & OneHanded> void equip(T weapon) {
<T extends Ranged & OneHanded> void equip(T weapon) {
注意顺序的更改,以使过载具有明显的擦除效果。但是,拥有不同的名称比重载更好。
(此外,我将使用间接层,而不是使用基本类型丢失类型信息。)