私はロボットと呼ばれるクラスを持っているとしましょう。 Robotクラスからは、Racerというサブクラスがあります。 SwimmerとRunnerという2つのサブクラスがRacerを拡張しています。メソッドのパラメータをキャストする - Java
Racer(およびそのすべての子)には、sprint()というメソッドがあります。
別のクラスでは、Racer引数(またはその子要素)を取るraceという静的クラスメソッドを記述します。レースの方法では、私は再びレーサーとその子供たちに固有のスプリント方法を利用します。
コードは正常に実行されますが、sprintメソッドでRobot引数を渡したい場合はどうすればよいですか?ロボットをレーサーとして投げられるようにするコードは何ですか?
私は
public static void race((Racer) Robot arg) { //race method here }
を実行しようとしましたが、それはうまくいきませんでした。何か案は?
レーサーではないロボットとの「レース(...)」であなたは何をしますか? – Radiodef
'public static void race(Robot arg){((レーサー)arg).sprint(); } '。 'Racer'ではない' Robot'を渡すとクラッシュして 'ClassCastException'で焼き尽くします。だから、なぜそれが起こるのを防ぐコンパイラの型チェックを避けたいのですか? – Andreas
メソッドが 'Racer'をとるように記述されている場合は、その型のインスタンスへの参照を受け取らなければなりません。参照変換(「ダウンキャスティング」)を狭めることは、(ほとんど)決して行うべきことではありません。あなたのキャストa)は「ロボット」が必ずしも「レーサー」であるとは限らず、b)「a)」の場合は「ClassCastException」から保護するか、例外を捕捉して処理する必要があります。しかし、最善のアプローチはダウンキャストではありません。あなたが実際に実際に実際にそれを渡す計画で実際に引数の型を取るメソッドを記述します。 –