构造泛型问题
Constructor generics issue
我正在制作一个基于文本的小游戏,只是为了好玩,我正在研究泛型,运行 遇到了问题。
我有一个 class 可装备:
public class Equippable extends Item
{
double mDurability;
public Equippable(String name, double weight, double durability)
{
super(name, weight);
mDurability = durability;
}//Equippable
//Getters
public double getDurability(){return mDurability;}
//Setters
public void setDurability(double Durability){mDurability = Durability;}
}//Equippable
我有一个名为 BodyPart 的 class 的构造函数,我想接受 Equippable 的任何子 class 作为参数:
public BodyPart(String name, Class<? extends Equippable> equipClass)
{
mName = name;
mEquipClass = equipClass;
}//BodyPart
可装备一件class装甲。
public class Armor extends Equippable
{
double mArmorRating;
public Armor(String name, double weight, double durability, double armorrating)
{
super(name, weight, durability);
mArmorRating = armorrating;
}//Armor
}//Armor
最后我有几个 class 扩展 Armor.class。我不会 post 它们全部因为它们在这一点上是相同的,除了 class.
的名称
public class HumanoidBodyArmor extends Armor
{
public HumanoidBodyArmor(String name, double weight, double durability, double armorrating)
{
super(name, weight, durability, armorrating);
}//HumanoidBodyArmor
}//HumanHeadArmor
当我这样做时:
BodyPart bp = new BodyPart("Head" , Armor.class));
一切正常,对象已创建。但是当我这样做时
BodyPart bp = new BodyPart("Head" , HumanHeadArmor.class));
Eclipse 发脾气说
The constructor BodyPart(String, Class<HumanoidHeadArmor>) is undefined
我非常确定这会起作用,但显然我遗漏了一些东西。有人可以阐明这个问题吗?
我这样做只是为了理智
Equippable.class.isAssignableFrom(HumanoidHeadArmor.class)
它确实评估为真。
编辑
根据评论中的要求,这是 HumanoidBodyArmor class
public class HumanoidBodyArmor extends Armor
{
public HumanoidBodyArmor(String name, double weight, double durability, double armorrating)
{
super(name, weight, durability, armorrating);
}//HumanoidBodyArmor
}//HumanoidBodyArmor
headarmor/bodyarmor/footarmor没有区别。除了名字之外,它们都是相同的。只是具有相同构造函数的空 classes,这些构造函数只是调用它们父级的 (Armor) 构造函数。
您没有正确使用 generics
首先,Equippable
可能应该是 interface
而不是 class,并且 Armor
也可以是扩展 interface
Equippable
那你可以
public class BodyPart {
public BodyPart(String name, Equipable equip)
{
mName = name;
mEquip = equip;
}
}
and
public class Head extends BodyPart {
public Head(String name, HumanoidHeadArmor equippable) {
super(name, equippable);
}
}
这一切对我来说都很好 - 我怀疑你有一些命名问题。
class Item {
public Item(String name, double weight) {
}
}
public class Equippable extends Item {
double mDurability;
public Equippable(String name, double weight, double durability) {
super(name, weight);
mDurability = durability;
}
//Getters
public double getDurability() {
return mDurability;
}
//Setters
public void setDurability(double Durability) {
mDurability = Durability;
}
}
class BodyPart {
String name;
Class<? extends Equippable> equipClass;
public BodyPart(String name, Class<? extends Equippable> equipClass) {
this.name = name;
this.equipClass = equipClass;
}
}
public class Armor extends Equippable {
double mArmorRating;
public Armor(String name, double weight, double durability, double armorrating) {
super(name, weight, durability);
mArmorRating = armorrating;
}
}
public class HumanoidBodyArmor extends Armor {
public HumanoidBodyArmor(String name, double weight, double durability, double armorrating) {
super(name, weight, durability, armorrating);
}
}
public void test() {
BodyPart head = new BodyPart("Head", Armor.class);
BodyPart body = new BodyPart("Body", HumanoidBodyArmor.class);
}
我正在制作一个基于文本的小游戏,只是为了好玩,我正在研究泛型,运行 遇到了问题。
我有一个 class 可装备:
public class Equippable extends Item
{
double mDurability;
public Equippable(String name, double weight, double durability)
{
super(name, weight);
mDurability = durability;
}//Equippable
//Getters
public double getDurability(){return mDurability;}
//Setters
public void setDurability(double Durability){mDurability = Durability;}
}//Equippable
我有一个名为 BodyPart 的 class 的构造函数,我想接受 Equippable 的任何子 class 作为参数:
public BodyPart(String name, Class<? extends Equippable> equipClass)
{
mName = name;
mEquipClass = equipClass;
}//BodyPart
可装备一件class装甲。
public class Armor extends Equippable
{
double mArmorRating;
public Armor(String name, double weight, double durability, double armorrating)
{
super(name, weight, durability);
mArmorRating = armorrating;
}//Armor
}//Armor
最后我有几个 class 扩展 Armor.class。我不会 post 它们全部因为它们在这一点上是相同的,除了 class.
的名称public class HumanoidBodyArmor extends Armor
{
public HumanoidBodyArmor(String name, double weight, double durability, double armorrating)
{
super(name, weight, durability, armorrating);
}//HumanoidBodyArmor
}//HumanHeadArmor
当我这样做时:
BodyPart bp = new BodyPart("Head" , Armor.class));
一切正常,对象已创建。但是当我这样做时
BodyPart bp = new BodyPart("Head" , HumanHeadArmor.class));
Eclipse 发脾气说
The constructor BodyPart(String, Class<HumanoidHeadArmor>) is undefined
我非常确定这会起作用,但显然我遗漏了一些东西。有人可以阐明这个问题吗?
我这样做只是为了理智
Equippable.class.isAssignableFrom(HumanoidHeadArmor.class)
它确实评估为真。
编辑 根据评论中的要求,这是 HumanoidBodyArmor class
public class HumanoidBodyArmor extends Armor
{
public HumanoidBodyArmor(String name, double weight, double durability, double armorrating)
{
super(name, weight, durability, armorrating);
}//HumanoidBodyArmor
}//HumanoidBodyArmor
headarmor/bodyarmor/footarmor没有区别。除了名字之外,它们都是相同的。只是具有相同构造函数的空 classes,这些构造函数只是调用它们父级的 (Armor) 构造函数。
您没有正确使用 generics
首先,Equippable
可能应该是 interface
而不是 class,并且 Armor
也可以是扩展 interface
Equippable
那你可以
public class BodyPart {
public BodyPart(String name, Equipable equip)
{
mName = name;
mEquip = equip;
}
}
and
public class Head extends BodyPart {
public Head(String name, HumanoidHeadArmor equippable) {
super(name, equippable);
}
}
这一切对我来说都很好 - 我怀疑你有一些命名问题。
class Item {
public Item(String name, double weight) {
}
}
public class Equippable extends Item {
double mDurability;
public Equippable(String name, double weight, double durability) {
super(name, weight);
mDurability = durability;
}
//Getters
public double getDurability() {
return mDurability;
}
//Setters
public void setDurability(double Durability) {
mDurability = Durability;
}
}
class BodyPart {
String name;
Class<? extends Equippable> equipClass;
public BodyPart(String name, Class<? extends Equippable> equipClass) {
this.name = name;
this.equipClass = equipClass;
}
}
public class Armor extends Equippable {
double mArmorRating;
public Armor(String name, double weight, double durability, double armorrating) {
super(name, weight, durability);
mArmorRating = armorrating;
}
}
public class HumanoidBodyArmor extends Armor {
public HumanoidBodyArmor(String name, double weight, double durability, double armorrating) {
super(name, weight, durability, armorrating);
}
}
public void test() {
BodyPart head = new BodyPart("Head", Armor.class);
BodyPart body = new BodyPart("Body", HumanoidBodyArmor.class);
}