我很难将对象从扩展的Object类转换为它的子类。 遵循此代码模板。
public class Athletic1 extends Object {
public void run(){
// run 5km
}
}
public class Athletic2 extends Object {
public void run(){
// run 10km
}
}
class SpecificClass{
// receive an athletic
SpecificClass(Object obj){
// HERE i like do something as
// The left side dont Work
(obj.getClass().getName) nameVariable = (obj.getClass().getName()) obj;
}
}
class Main{
public static void main(String[] args){
Athletic1 a1 = new Athletic1();
Athletic2 a2 = new Athletic2();
SpecificClass sc1 = new SpecificClass(a1);
SpecificClass sc2 = new SpecificClass(a2);
}
}
我可以求助于instanceOf,但是当我有大量的子类对象时,代码将变得非常广泛。有其他选择吗?
// Supose that i hava 10 Athletic Class
// I have that do this????????
if (obj instanceOf Athletic1)
Athletic1 a1 = (Athletic1) obj;
...
...
else{
Athletic1 a10 = (Athletic10) obj;
}
有人可以帮助我吗? 谢谢
答案 0 :(得分:2)
尝试时不能以动态方式使用类型转换。以下是您要执行的操作中的一些问题:
(obj.getClass().getName()) obj;
括号内的“内容”必须是标识符,而不是表达式。该标识符必须是编译时已知的实际类或实际接口的名称。它不能是变量的标识符。它甚至不能是类型参数的标识符。
(obj.getClass().getName) nameVariable = ...
这是完全错误的。没有这样的语法可以让您在这样的作业的左侧使用类型转换。
那么可以避免使用instanceof
来“子类化”实例吗?
instanceof
未用于子类化。类型转换就是这样做的! instanceof
实际上是用来区分子类的。
不使用instanceof
也有可能(尽管可能不是您想要的!)。
在类名上使用switch
:
switch (obj.getClass().getName()) {
case "a.b.Athletic1":
Athletic1 a1 = (Athletic1) obj;
// do stuff
break;
...
case "a.b.Athletic10":
Athletic10 a10 = (Athletic10) obj;
// do stuff
}
问题:您仍然可以使用样板代码来区分固定数量的案例。
使用Map
。
Map<Class<?>, Consumer<?>> mapping = new Map<> {{
put(a.b.Athletic1.class,
o -> {
Athletic1 a1 = (Athletic1) o;
// do stuff
});
put(a.b.Athletic10.class,
o -> {
Athletic10 a10 = (Athletic10) o;
// do stuff
});
}};
Consumer<Object> c = mapping.get(obj.getClass());
if (c != null) {
c.accept(obj);
}
优势:
Consumer
对象可以作为代理类动态创建。 (尽管那很贵!)缺点:仍然很多样板。
尽管这些方法避免了显式的instanceof
,但(IMO)这些方法与您现有的方法一样糟糕。 “代码气味”仍然存在。
IMO,真正的解决方案是使用Java多态性。
为Athletic
类创建一个公共超类/接口。
在超类/接口中创建表示操作的方法
在每个Athletic
类中实施action方法。
调用它...