假设我有一个名为Robot的类。从Robot类中,我有一个名为Racer的子类。称为Swimmer和Runner的两个子类都扩展了Racer。在方法中投射参数 - Java
赛车手(及其所有的孩子)都有一种叫做sprint()的方法。
在另一个类中,我编写了一个名为race的静态类方法,它接受一个Racer参数(或其任何子参数)。在比赛方法中,我使用了冲刺方法,这对赛车手及其孩子来说也是独一无二的。
代码运行成功,但如果我想通过sprint方法传递一个Robot参数会怎么样?什么是允许我将机器人作为赛车手的代码?
我试图做
public static void race((Racer) Robot arg) { //race method here }
,但没有奏效。有任何想法吗?
你会在'种族(...)'中做一个不是赛车手的机器人吗? – Radiodef
'public static void race(Robot arg){((Racer)arg).sprint(); }'。如果你传递一个不是'Racer'的Robot,它会崩溃并且被'ClassCastException'烧毁,那么为什么你要放弃编译器类型检查来防止这种情况发生? – Andreas
如果写入方法采用'Racer',那么它必须接收对该类型实例的引用。缩小参考转换(“向下转换”)是人们应该(几乎)不会做的事情。您的演员a)可能无法工作,因为'Robot'不一定是'Racer',并且b)应该在“a)”的情况下受到保护而不受'ClassCastException'的影响,或者更不理想的情况是捕捉并处理该异常。但是,最好的方法是不要沮丧。写下这个方法,将实际计划中实际上真正实际应用的参数类型传递给它。 –