[英]How to cast a subclass to a superclass [cannot convert]?
我有一個名為 Hero 的通用類和三個擴展它的子類:Mage、Warrior、Ranger。 英雄類有健康和力量,每個子類都有額外的屬性。
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;”。 所以我很困惑為什么我的英雄戰士不能被施展到英雄對象上。
這里:
Hero hero1 = new Hero(100,10);
你是說hero1
是Hero
這里:
Warrior h1 = (Hero)hero1
您試圖說hero1
是Warrior
,但事實並非如此。 這是一個Hero
。
以下是關鍵:所有Warrior
實例都是Hero
實例,但並非所有Hero
實例都是Warrior
。
要將hero1
轉換為Warrior
,則必須將其創建為Warrior
。 例如
Hero hero1 = new Warrior(100,10);
我相信你下面所說的是一種誤解:
...我想創建該英雄類並將其轉換為英雄,這樣它也將具有英雄屬性和方法。
子類始終具有其超類的屬性。 所以在這種情況下,如果Warrior
是一個子類的Hero
,那么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
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.