如何将子类强制转换为超类[无法转换]?

时间:2017-01-19 21:50:25

标签: java inheritance casting subclass superclass

我有一个名为Hero的通用类和三个扩展它的子类:Mage,Warrior,Ranger。 Hero类具有健康和强度,每个子类都有其他属性。

public class Warrior extends Hero {
private int armor;

public Warrior(int health, int strength, int armor) {
    super(health,strength);
    this.armor = armor;
}

}


public class Hero {
private int health;
private int strength;

public Hero(int health, int strength) {
    this.health = health;
    this.strength = strength;

}

//Getters
public int getHealth() {
    return health;
}
public int strength() {
    return strength;
}
//Setters
public void takeDamage(Hero player, int n) {
    player.health = player.health-n;
}
public void healDamage(Hero player, int n) {
    player.health = player.health+n;
}

}

在主课程中,我正在尝试制作两个英雄对象,当用户选择他们想要的类时,我想创建该英雄类并将其作为英雄投射,因此它将具有英雄属性和方法

public static void main(String[] args) {

    Hero hero1 = new Hero(100,10);
    Hero hero2 = new Hero(100,10);
    //Players select the class
    Scanner scanner = new Scanner(System.in);
    System.out.println("Player select a class: Warrior, Mage, Ranger ");
    String p = scanner.next();
    switch (p) {
    case "Warrior": Warrior h1 = (Hero)hero1; //this doesn't work
        break;
    case "Mage":
        break;
    case "Ranger":
        break;
    }




}

我环顾四周,我在一个例子中理解对象可能是一个整数,你可以做“int i =(Integer)object;”。所以我很困惑,为什么我的英雄战士不能被铸造成英雄对象。

2 个答案:

答案 0 :(得分:1)

下面:

Hero hero1 = new Hero(100,10);

您说hero1Hero

下面:

Warrior h1 = (Hero)hero1

您试图说hero1Warrior,但事实并非如此。这是一个Hero

以下是关键:所有Warrior个实例都是Hero个实例,但并非所有Hero个实例都是Warrior

要将hero1投射到Warrior,必须将其创建为Warrior。 e.g。

Hero hero1 = new Warrior(100,10);

答案 1 :(得分:0)

我相信你下面所说的是一种误解:

  

...我想创建那个英雄级别并将其作为英雄投射,以便它具有   英雄的属性和方法。

子类总是具有超类的属性。因此,在这种情况下,如果WarriorHero的子类,则Warrior将包含Hero所具有的所有属性和方法,因此您并不需要“将一个子类投入超级班级”。从来没有这样的需要。

在这个特定的例子中,您可能想要写的是

Hero hero1 = new Hero(100 /* health */,10 /* strength */);
. . .
case "Warrior": 
    Hero h1 = hero1; 
    break;

或者这个

Hero warrior1 = new Warrior(100 /* health */
                            ,10 /* strength */
                            ,20 /* armor */);
. . .
case "Warrior": 
    Hero h1 = warrior1 ; 
    break;

甚至是这个

Warrior warrior1 = new Warrior(100 /* health */
                               ,10 /* strength */
                               ,20 /* armor */);
. . .
case "Warrior": 
    Hero h1 = warrior1 ; 
    break;

哪一个更合适?这取决于您的具体情况(即您真的希望对象是Hero还是Warrior)。