如何在不使用JAVA的情况下转换为对象类的子类?

时间:2018-12-16 01:33:09

标签: java javafx casting instance declaration

我很难将对象从扩展的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;
        }

有人可以帮助我吗? 谢谢

1 个答案:

答案 0 :(得分:2)

尝试时不能以动态方式使用类型转换。以下是您要执行的操作中的一些问题:

(obj.getClass().getName()) obj;

括号内的“内容”必须是标识符,而不是表达式。该标识符必须是编译时已知的实际类或实际接口的名称。它不能是变量的标识符。它甚至不能是类型参数的标识符。

(obj.getClass().getName) nameVariable = ...

这是完全错误的。没有这样的语法可以让您在这样的作业的左侧使用类型转换。


那么可以避免使用instanceof来“子类化”实例吗?

instanceof未用于子类化。类型转换就是这样做的! instanceof实际上是用来区分子类的。

不使用instanceof也有可能(尽管可能不是您想要的!)。

  1. 在类名上使用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
    }
    

    问题:您仍然可以使用样板代码来区分固定数量的案例。

  2. 使用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多态性。

  1. Athletic类创建一个公共超类/接口。

  2. 在超类/接口中创建表示操作的方法

  3. 在每个Athletic类中实施action方法。

  4. 调用它...