2015-02-26 3 views
1

Я делаю небольшую текстовую игру для удовольствия, и я возился с дженериками и столкнулся с проблемой.Проблема с генераторами генераторов

У меня есть класс Экипирующий:

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 

У меня есть конструктор для класса под названием часть тела, которую я хочу принять любой подкласс Экипирующих в качестве параметра:

public BodyPart(String name, Class<? extends Equippable> equipClass) 
{ 
    mName   = name; 
    mEquipClass = equipClass; 
}//BodyPart 

Экипирующих имеют подкласс Броня.

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 

Наконец-то у меня есть несколько классов, которые расширяют Armor.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) 

и действительно оценить, верно.

EDIT Как было предложено в комментариях, вот это класс HumanoidBodyArmor

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. Твое все одинаково, кроме имени. Просто пустые классы с одинаковыми конструкторами, которые просто называют конструктором своего родителя (Armor).

+0

HumanHeadArmor или HumanoidHearArmor? Не могли бы вы показать код обоих классов? –

+0

@JaroslawPawlak * соответствующий код * только ... – m0skit0

+0

У вас нет двух классов с одинаковым именем в вашем пути к классу? В противном случае я не вижу никаких проблем с вашим кодом. –

ответ

0

Все это работает для меня - я подозреваю, что у вас есть проблема с именами.

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); 
} 
+0

Woooow I suck. Думаю, Eclipse испортил меня. Класс не импортировался. Вероятно, из-за моей неуклюжей структуры пакета, с которой я возился. – 0nyx

+0

@ 0nyx хе-хе, и поэтому хорошо придерживаться стандартной структуры пакета/проекта. : D – Joeblade

+0

@ 0nyx - Я часто нахожу создание простой демонстрации проблемы как полностью отдельный тестовый код - я использую внутренние классы для компактности - позволяет вам находить глупые ошибки, прежде чем вы испытываете затруднения при размещении их в Интернете. :) – OldCurmudgeon

0

Вы не используете generics правильно

Для начала Equippable следует, вероятно, в interface, а не класс, а 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); 
    } 
} 
+0

Как это лучше использовать дженерики? – Joeblade

+0

Не хотите ли вы аннулировать (если возможно, я понимаю, что написание эссе в комментариях не одобряется) о том, почему я неправильно использую дженерики? Я пытался избежать таких вещей, как возможность оснастить меч на теле. Я чувствовал, что могу сделать это, только разрешив части тела иметь определенный тип предмета, оборудованный на нем. Поэтому, если я создаю руку, я даю ей equipClass в качестве параметра, тогда я могу проверить, может ли элемент быть экипирован путем тестирования, если он является подклассом этого equipClass. – 0nyx

+0

@ 0nyx собираюсь создать новый ответ, чтобы ответить на ваш вопрос – ControlAltDel

Смежные вопросы