【问题标题】:How to cast a subclass to a superclass [cannot convert]?如何将子类转换为超类[无法转换]?
【发布时间】:2017-06-04 18:36:53
【问题描述】:

我有一个名为 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;”。所以我很困惑为什么我的英雄战士不能被施放到英雄对象上。

【问题讨论】:

  • Warrior 应该扩展 Here
  • 把这个类的代码:MageWarriorRanger
  • “我的英雄战士不能被施放到英雄对象”你没有战士,你有一个任意的英雄实例,你不能并且不应该尝试进行沮丧。如果你不想要一个战士,那就创建一个,而不是创建一个 Hero 实例并施放它。
  • 抱歉,我刚刚意识到我复制了两次英雄类而不是显示战士类。现已修复

标签: java inheritance casting subclass superclass


【解决方案1】:

这里:

Hero hero1 = new Hero(100,10);

你是说hero1Hero

这里:

Warrior h1 = (Hero)hero1

您想说hero1Warrior,但事实并非如此。这是Hero

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

要将hero1 转换为Warrior,必须将其创建为Warrior。例如

Hero hero1 = new Warrior(100,10);

【讨论】:

    【解决方案2】:

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

    ...我想创建那个英雄类并将其转换为英雄,这样它就有了 hero 属性和方法。

    子类始终具有其超类的属性。所以在这种情况下,如果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)。

    【讨论】:

    • “哪个更合适?”都没有,因为它们都使用范围相当有限的局部变量。
    猜你喜欢
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多