2016-04-27 8 views
0

私はClassCastExceptionがこのクラスを型キャストする方法は?

を得ることなくProBasketballPlayerにそれを型キャストすることができますどのようにオブジェクト

BasketBallPlayer bp1; 
bp1=new BasketBallPlayer("Tim Duncan", "Center", "Spurs", 83, 220, 4, 5, 8); 


public class BasketBallPlayer { 
    protected String name; 
    protected String position; 
    protected String team; 
    protected int height; 
    protected int weight; 
    protected int agility; 
    protected int speed; 
    protected int ballHandling; 

    public BasketBallPlayer() { 
     this.name = "unknown"; 
     this.position = "unknown"; 
     this.team = "unknown"; 
     this.height = 0; 
     this.weight = 0; 
     this.agility = 0; 
     this.speed = 0; 
     this.ballHandling = 0; 
    } 

    public BasketBallPlayer(String name, String position, String team) 
    { 
     this.name = name; 
     this.position = position; 
     this.team = team; 
     this.height = 0; 
     this.weight = 0; 
     this.agility = 0; 
     this.speed = 0; 
     this.ballHandling = 0; 
    } 

    public BasketBallPlayer (String name, String position, String team, int height, int weight, 
       int agility, int speed, int ballHandling) 
    { 
     this.name = name; 
     this.position = position; 
     this.team = team; 
     this.height = height; 
     this.weight = weight; 
     this.agility = agility; 
     this.speed = speed; 
     this.ballHandling = ballHandling; 
    } 

を作成した場合、私はBasketBallPlayer

と呼ばれるこのスーパークラスは、私がProBasketBallPlayer

と呼ばれる子クラスを持っていますここにProBasketballPlayerのコンストラクタがあります

public class ProBasketballPlayer extends BasketBallPlayer { 
    protected int yearsInLeague; 
    protected String role; 

    public ProBasketballPlayer() 
    { 
     super(); 
     yearsInLeague = 0; 
     role = "bench"; 
    } 

    public ProBasketballPlayer(String name, String position, String team) 
    { 
     super(name, position, team); 
     this.name = name; 
     this.position = position; 
     this.team = team; 
     yearsInLeague = 0; 
     role = "bench"; 
    } 

    public ProBasketballPlayer(String name, String position, String team, int height, int weight, 
      int agility, int speed, int ballHandling, int yearsInLeague, String role) 
    { 
     super(name, position, team, height, weight, agility, speed, ballHandling); 
     this.yearsInLeague = yearsInLeague; 
     this.role = role; 
    } 
+2

サブクラスはスーパークラスとしてのみキャストできますが、他の方法でキャストすることはできません。簡単に言えば、フェラーリは一種の車ですが、車はフェラーリの一種ではありません。リストを作成し、メルセデス、フェラーリ、フォード車をリストに追加すると、これらのサブクラスのそれぞれが車のスーパークラスを持っていることを考えると、とてもうれしいでしょう。 – ManoDestra

+1

あなたはティム・ダンカンを食べるべきです。 83センチメートルの高さで体重220ポンドは健康に聞こえません。 –

+1

@RolandIllig何かがインチのことを私に伝えています... XD – 4castle

答えて

1

できません。キャストはオブジェクトに関する何も変わらないだけで、それはオブジェクトをさらにであると解釈することができることをコンパイラに伝えます。クラス階層ですが、ダウンしません。いったんオブジェクトをインスタンス化すると、そのオブジェクトがインスタンス化されます。そのオブジェクトは、あなたがインスタンス化したクラスのメンバーです。 BasketballPlayerで、ProBasketballPlayerになることはありません。プロが必要な場合は、インスタンスを作成します。プロを通常のバスケットボールプレーヤーとして使用できますが、その逆はできません。一例として、

class Foo 
{ 
    int a; 
} 
class Bar extends Foo 
{ 
    int b; 
} 

Foo obj = new Foo(); 
obj.a = 0; // our obj has an "a" field because it is a Foo. 
obj.b = 0; // but no "b" field, because it is not a Bar. 

// It therefore makes no sense to do this: 
((Bar)obj).b = 0; // because that's the same as trying to do "obj.b" 

// in either case, "obj" is not a "Bar", and cannot have a "b" field. "obj" will always be a "Foo", never a "Bar". 

// 
// If however we make a Bar: 
Bar obj2 = new Bar(); 

// we can access both fields, since Bar has both of them 
obj2.a = 0; 
obj2.b = 0; 

// and, since Bar is a SUPERSET of Foo (all Bar are Foo, not all Foo are Bar), 
// we can even use obj2 as a Foo, and pass it to methods which accept a Foo. 
0

は、どのように私はあなたが間違った方向にキャストすることはできません ClassCastExceptionが

を得ることなくProBasketballPlayerにそれを型キャストすることができます。 ...

  1. ISA BasketballPlayer ProBasketballPlayer次の2つのステートメントについて考えてみて?
  2. Are すべて BasketBallPlayers ProBasketBall players?

いいえ私はバスケットボールをしています。私はプロバスケットボール選手ではありません。

BirdはすべてDuckです。

Bird b = new Bird(); 
Duck daffy = (Bird)b; 
daffy.quack(); // Error here, not all birds quack? 
0

オブジェクトをサブクラスにキャストすることはできません。オブジェクトは、そのコンストラクタの型が何であったかだけ "下方に"キャストすることができます。 CatはすべてAnimalですが、AnimalのすべてがCatであるとは限りません。キャスティングは片方向に過ぎません。

でき関連分野のBasketBallPlayerおよびコピーを受け入れるProBasketballPlayerでコンストラクタを作成されません。 ProBasketballPlayerにもある可能性がある追加のフィールドを必ず初期化してください。

public ProBasketballPlayer(BasketBallPlayer bbp, int yearsInLeague, String role) { 
    super(bbp.getName(), bbp.getPosition(), bbp.getTeam(), bbp.getHeight(), bbp.getWeight(), bbp.getAgility(), bbp.getSpeed(), bbp.getBallHandling()); 
    this.yearsInLeague = yearsInLeague; 
    this.role = role; 
} 

public public ProBasketballPlayer(BasketBallPlayer bbp) { 
    this(bbp, 0, "bench"); 
} 

ProBasketballPlayerBasketBallPlayerと同じパッケージ内にある場合は、代わりにゲッターを使用する(例えばbbp.name)直接フィールドにアクセスすることができます。

+0

私はそのサウンドが好きですが、ProBasketballplayerの中でそのようなものを受け入れるコンストラクタを作るにはどうすればいいですか? –

+0

私の答えが更新されました。 'BasketBallPlayer'のすべてのインスタンスデータのゲッターを作成する必要があります。そうしないと、' protected'がデータにアクセスできなくなります。ゲッタを追加できない場合は、不可能かもしれません。 – 4castle

+0

彼らが同じパッケージに入っていない限り、私は言及すべきです。 – 4castle

関連する問題