2017-05-27 7 views
0

私はロボットと呼ばれるクラスを持っているとしましょう。 Robotクラスからは、Racerというサブクラスがあります。 SwimmerとRunnerという2つのサブクラスがRacerを拡張しています。メソッドのパラメータをキャストする - Java

Racer(およびそのすべての子)には、sprint()というメソッドがあります。

別のクラスでは、Racer引数(またはその子要素)を取るraceという静的クラスメソッドを記述します。レースの方法では、私は再びレーサーとその子供たちに固有のスプリント方法を利用します。

コードは正常に実行されますが、sprintメソッドでRobot引数を渡したい場合はどうすればよいですか?ロボットをレーサーとして投げられるようにするコードは何ですか?

私は

public static void race((Racer) Robot arg) { //race method here }

を実行しようとしましたが、それはうまくいきませんでした。何か案は?

+5

レーサーではないロボットとの「レース(...)」であなたは何をしますか? – Radiodef

+2

'public static void race(Robot arg){((レーサー)arg).sprint(); } '。 'Racer'ではない' Robot'を渡すとクラッシュして 'ClassCastException'で焼き尽くします。だから、なぜそれが起こるのを防ぐコンパイラの型チェックを避けたいのですか? – Andreas

+0

メソッドが 'Racer'をとるように記述されている場合は、その型のインスタンスへの参照を受け取らなければなりません。参照変換(「ダウンキャスティング」)を狭めることは、(ほとんど)決して行うべきことではありません。あなたのキャストa)は「ロボット」が必ずしも「レーサー」であるとは限らず、b)「a)」の場合は「ClassCastException」から保護するか、例外を捕捉して処理する必要があります。しかし、最善のアプローチはダウンキャストではありません。あなたが実際に実際に実際にそれを渡す計画で実際に引数の型を取るメソッドを記述します。 –

答えて

0

メソッド引数は型キャストできません。あなたは引数としてスーパークラスを与えることができるので、内部メソッドは実行時オブジェクトに基づいて型キャストできます。

+0

その構文は何でしょうか? –

+0

インターフェースとしてRobotクラスを作成し、抽象メソッドを与えることができます。 Robotクラスを実装するクラスを作成し、抽象メソッドをオーバーライドします。 パブリックインターフェイスロボット{ \t public void sprint(); } publicクラスレーサーロボット{ \t公共ボイドスプリント(){ \t \tのSystem.out.println( "ABC")を実装します。 \t}} パブリッククラスTest { \tパブリック静的ボイドレース(ロボットのarg){ \t \t arg.sprint()。 \t} } –

関連する問題