gpt4 book ai didi

java - 我可以使用原始类作为类型并仍然使用它的子类吗?

转载 作者:行者123 更新时间:2023-12-02 02:24:14 24 4
gpt4 key购买 nike

我正在编写这段代码,我碰巧将类型作为原始类。现在,如果我将变量与其子类(扩展类)一起插入,则会出错。我正在运行一个 Spigot 插件,但显然这个问题与 Spigot 本身无关,而是我对 Java 缺乏了解。

我想不出任何单一的解决方案,而且我已经到处寻找。

编辑(我的解释):如果您查看 PlayerClass,您将看到一个名为 Kit 的变量,它使用 KitClass 类型。如果您查看 KitClass,您会发现它是一个具有一个名为 Alchemist 的子类的类。我的问题是,KitClass类型是否包含所有继承的类和原始类?如果不是,那么我必须对 PlayerClass 中的 Kit 变量使用什么类型/修改才能允许将 Alchemist 类的实例设置为 Kit 变量?

package me.kckeith.KitPvP;

import org.bukkit.entity.Player;

public class PlayerClass {
public Player Player;
public double Coins;
public KitClass Kit;

public PlayerClass(Player Player, double Coins, KitClass Kit) {
this.Player = Player;
this.Coins = Coins;
this.Kit = Kit;
}

public void setKit(KitClass Kit) {
this.Kit = Kit;
this.Kit.giveStuff();
}
}
package me.kckeith.KitPvP;

import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;

import net.md_5.bungee.api.ChatColor;

public class KitClass {
public Player Player;
public Material InventoryIcon;

public KitClass(Player player) {
this.Player = player;
}

public void giveStuff() {
Bukkit.getServer().getConsoleSender().sendMessage(ChatColor.GOLD + "Given items!");
}
}
package me.kckeith.KitPvP.Kits;

import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.PotionMeta;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;

import me.kckeith.KitPvP.KitClass;

public class Alchemist extends KitClass {
public static Material InventoryIcon = Material.SPLASH_POTION;

public Alchemist(Player player) {
super(player);
}

public void giveStuff() {
// Clear items

this.Player.getInventory().clear();

// Give the player their armor

ItemStack[] Armor = new ItemStack[4];
Armor[0] = new ItemStack(Material.LEATHER_BOOTS);
Armor[1] = new ItemStack(Material.LEATHER_LEGGINGS);
Armor[2] = new ItemStack(Material.LEATHER_CHESTPLATE);
Armor[3] = new ItemStack(Material.LEATHER_HELMET);

// Add Enchants
Armor[0].addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1);
Armor[1].addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1);
Armor[2].addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1);
Armor[3].addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1);

// Give Armor
this.Player.getInventory().setArmorContents(Armor);

// Give Golden Sword

ItemStack GoldenSword = new ItemStack(Material.GOLDEN_SWORD);
GoldenSword.addEnchantment(Enchantment.DURABILITY, 1);

this.Player.getInventory().addItem(GoldenSword);

// Give Regen Potions

ItemStack RegenPotion = new ItemStack(Material.POTION, 4);
PotionMeta RegenPotionMeta = (PotionMeta) RegenPotion.getItemMeta();
RegenPotionMeta.addCustomEffect(new PotionEffect(PotionEffectType.REGENERATION, 20, 2), true);
RegenPotion.setItemMeta(RegenPotionMeta);

this.Player.getInventory().addItem(RegenPotion);

// Give Damage Potions
ItemStack DamagePotion = new ItemStack(Material.SPLASH_POTION, 8);
PotionMeta DamagePotionMeta = (PotionMeta) DamagePotion.getItemMeta();
DamagePotionMeta.addCustomEffect(new PotionEffect(PotionEffectType.HARM, 0, 2), true);
DamagePotion.setItemMeta(DamagePotionMeta);

this.Player.getInventory().addItem(DamagePotion);

super.giveStuff();
}
}

我认为的具体错误是 NullStackException 但我不确定。我在代码顶部更详细地讨论了这个问题。

最佳答案

My question is does the KitClass type encompass all the inherited classes and original class?

是的,所以当您创建 Alchemist 时,您仍然可以使用所有 KitClass 方法。这是正确的:Alchemist myAlchemistObject = new Alchemist(myPlayer);

<小时/>

您有很多可能令人困惑的代码。您不应拥有同名的类和对象/变量。

例如,在声明变量时,这不好:

public Player Player;

但这很清楚且易于阅读:

public Player player;

这又更好了,并且不会出现混淆/困惑:

public Player myPlayer;

另一个例子。这还不清楚:

            PlayerClass PlayerClass = MainClass.PlayerList.get(Player.getUniqueId());
Alchemist Alchemist = new Alchemist(Player);
PlayerClass.Kit = Alchemist;
PlayerClass.Kit.giveStuff();

这很容易理解:

            PlayerClass myPlayerObject = MainClass.PlayerList.get(myPlayer.getUniqueId());
Alchemist myAlchemistObject = new Alchemist(myPlayer);
myPlayerObject.Kit = myAlchemistObject;
myPlayerObject.Kit.giveStuff();

关于java - 我可以使用原始类作为类型并仍然使用它的子类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57263792/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com