2017-05-27 37 views
0

假设我有一个名为Robot的类。从Robot类中,我有一个名为Racer的子类。称为Swimmer和Runner的两个子类都扩展了Racer。在方法中投射参数 - Java

赛车手(及其所有的孩子)都有一种叫做sprint()的方法。

在另一个类中,我编写了一个名为race的静态类方法,它接受一个Racer参数(或其任何子参数)。在比赛方法中,我使用了冲刺方法,这对赛车手及其孩子来说也是独一无二的。

代码运行成功,但如果我想通过sprint方法传递一个Robot参数会怎么样?什么是允许我将机器人作为赛车手的代码?

我试图做

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

,但没有奏效。有任何想法吗?

+5

你会在'种族(...)'中做一个不是赛车手的机器人吗? – Radiodef

+2

'public static void race(Robot arg){((Racer)arg).sprint(); }'。如果你传递一个不是'Racer'的Robot,它会崩溃并且被'ClassCastException'烧毁,那么为什么你要放弃编译器类型检查来防止这种情况发生? – Andreas

+0

如果写入方法采用'Racer',那么它必须接收对该类型实例的引用。缩小参考转换(“向下转换”)是人们应该(几乎)不会做的事情。您的演员a)可能无法工作,因为'Robot'不一定是'Racer',并且b)应该在“a)”的情况下受到保护而不受'ClassCastException'的影响,或者更不理想的情况是捕捉并处理该异常。但是,最好的方法是不要沮丧。写下这个方法,将实际计划中实际上真正实际应用的参数类型传递给它。 –

回答

0

方法参数不能类型转换。你可以给超类作为参数,这样内部方法可以基于运行时对象进行类型转换。

+0

那是什么语法? –

+0

您可以创建Robot类作为接口并给出抽象方法。创建一个实现Robot类的类,然后重写抽象方法。 公共接口机器人{0} {0} {0} {0} } 公共类赛车实现机器人{ \t公共无效冲刺(){ \t \t的System.out.println( “ABC”); \t}} 公共类的测试{ \t公共静态无效的比赛(机器人ARG){ \t \t arg.sprint(); \t} } –