将对象强制转换为作为参数传递的类类型

2022-09-04 08:12:35

我有一个家长班和2个子班。我正在尝试实现一个函数,该函数将子项的类型和哪个子项作为参数。

当我使用 时,我想将其存储在传递类型的变量中,并从第二个参数调用函数。child.newInstance()

以下是课程

public class Parent {
    public void test() {
        System.out.println("Test from parent");
    }
}

public class ChildA extends Parent {
    public void testChildA() {
        System.out.println("Test from child a");
    }
}

public class ChildB extends Parent {
    public void testChildB() {
        System.out.println("Test from child b");
    }
}

这是我试图实现的方法

public class Driver {
    Parent func(Class child, String whichChild) throws Exception {
        // whichChild: "ChildA" or "ChildB"

        Object obj = child.newInstance();
        // cast obj to type of child and call the method "test" and "test" + whichChild
    }
}

它能做到我想要做的事吗?如果是,如何将此对象强制转换为传递的类型?


答案 1

不确定您到底在做什么,但您可以使用.Class.cast(...)

例如

public <T> T getInstance(Class<T> type) {
    Object o = type.newInstance();
    T t = type.cast(o);
    return t;
}

答案 2

如果向 添加约束,则根本不需要强制转换即可获得父级:child

Parent func(Class<? extends Parent> child, String whichChild) throws Exception {
    // whichChild: "ChildA" or "ChildB"

    Parent obj = child.newInstance();
    //...
}

但是,您仍然无法调用 etc 方法,因为您所拥有的只是 的一个实例。您需要使用反射来获取该方法:testChildAParent

Method method = obj.getClass().getMethod().getMethod("test" + whichChild);
method.invoke(obj);

最好在接口上有一个可以调用的方法,并在子类中被覆盖。Parent

public abstract class Parent {
  public void test() {
    System.out.println("Test from parent");
  }

  public abstract void testChild();
}

然后只需调用:

obj.testChild();

或者,正如Emanuele Ivaldi所指出的那样,只需覆盖并直接调用它。testChildAChildB