有没有一种方法可以将枚举类型转换为其他枚举类型?

5

我正在尝试制作一个1.7.10的mod(我知道已经过时了,但在这个情况下我认为这不会太重要),将一些mod与CustomNPC合并,基本上添加一些武器,它们看起来和使用起来像CustomNPC武器,但是由不同的mod材料制成。该mod提供的盾牌在其构造函数中需要特定的枚举类型:

public class ItemShield extends ItemNpcInterface {

  public EnumNpcToolMaterial material;
  
  public ItemShield(int par1, EnumNpcToolMaterial material) {
    super(par1);
    this.material = material;
    setMaxDamage(material.getMaxUses());
    setCreativeTab((CreativeTabs)CustomItems.tabWeapon);
  }

枚举类型存储材料类型及其所有值。我不想编辑该模组代码本身,但我想向其中添加更多的材料。是否有一种方法可以向该枚举添加内容,或者可能将具有不同材料的相同枚举转换为该类型? 我已经通过创建一个自定义护盾类绕过了这个问题,该类仅从我的自定义枚举中获取值,但我很好奇是否有一种方法可以在不添加新类的情况下完成这项工作。 编辑: 我想添加模组的EnumNpcToolMaterial,以便更清楚地了解该盾构造函数需要什么。
public enum EnumNpcToolMaterial {
  WOOD(0, 59, 2.0F, 0, 15),
  STONE(1, 131, 4.0F, 1, 5),
  BRONZE(2, 170, 5.0F, 2, 15),
  IRON(2, 250, 6.0F, 2, 14),
  DIA(3, 1561, 8.0F, 3, 10),
  GOLD(0, 32, 12.0F, 1, 22),
  EMERALD(3, 1000, 8.0F, 4, 10),
  DEMONIC(3, 100, 8.0F, 6, 10),
  FROST(2, 59, 6.0F, 3, 5),
  MITHRIL(3, 3000, 8.0F, 3, 10);
  
  private final int harvestLevel;
  
  private final int maxUses;
  
  private final float efficiencyOnProperMaterial;
  
  private final int damageVsEntity;
  
  private final int enchantability;
  
  EnumNpcToolMaterial(int par3, int par4, float par5, int par6, int par7) {
    this.harvestLevel = par3;
    this.maxUses = par4;
    this.efficiencyOnProperMaterial = par5;
    this.damageVsEntity = par6;
    this.enchantability = par7;
  }
  
  public int getMaxUses() {
    return this.maxUses;
  }
  
  public float getEfficiencyOnProperMaterial() {
    return this.efficiencyOnProperMaterial;
  }
  
  public int getDamageVsEntity() {
    return this.damageVsEntity;
  }
  
  public int getHarvestLevel() {
    return this.harvestLevel;
  }
  
  public int getEnchantability() {
    return this.enchantability;
  }
}

你想要将哪种材料类/枚举类型转换成哪种? - Elikill58
@Elikill58 我想使用我的自定义相同枚举,或者至少在创建自定义盾牌时,在盾牌构造函数中编码的自定义值来代替它。 - AHuIci
2
YourOtherEnum.valueOf(otherEnum.name()) 或者类似的东西。 - Elikill58
仍然无法使其正常工作,在Eclipse中没有错误,但游戏不会启动并显示“无枚举常量”。我不确定是否做对了所有事情,因为我对Java还很陌生。 - AHuIci
2
@AHuIci:你无法直接向现有枚举类型中添加内容而不修改代码并进行重新编译。在Java中,枚举是合适的类型,不仅仅是某些其他语言中所说的整数值。这也意味着你不能像这样“将一个枚举转换为另一个枚举”。如果您*不需要现有代码与新值一起工作,则可能可以使用一些变通方法,但似乎这对您来说不够。 - Joachim Sauer
Java枚举类型不可扩展,除非编辑枚举定义并添加新值。请查看此问题的已接受答案:https://dev59.com/umkw5IYBdhLWcg3w1eC7 - DwB
1个回答

2
您正在寻找 EnumHelper.addEnum。虽然在Java中没有官方支持动态扩展Enum的方法,但在modded Minecraft中有足够的需求来这样做,因此Forge创建了一个类来自动执行所有反射和hackery所需的操作。您可以像这样使用它(未经测试):
EnumNpcToolMaterial ADAMANT = EnumHelper.addEnum(EnumNpcToolMaterial.class, "ADAMANT", new Class<?>[]{int.class, int.class, float.class, int.class, int.class}, new Object[]{3, 5000, 15.0F, 10, 30});

5
太有趣且令人作呕了;-) 这也可能是我不喜欢涉足改编的原因之一。 - Joachim Sauer

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