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

hak*_*ata 6 java generics class

我有一个父类和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");
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我试图实现的方法

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
    }
}
Run Code Online (Sandbox Code Playgroud)

可以做我想做的事吗?如果是,我如何将此对象转换为传递的类型?

lan*_*ava 7

不确定你正在做什么,但你可以使用Class.cast(...).

例如

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

  • 同意,我只是试图显示Class.cast(Object)的用法 (2认同)

And*_*ner 6

如果添加约束child,则根本不需要强制转换来获取父级:

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

    Parent obj = child.newInstance();
    //...
}
Run Code Online (Sandbox Code Playgroud)

但是,您仍然无法调用testChildAetc方法,因为您拥有的只是一个实例Parent.您需要使用反射来获取方法:

Method method = obj.getClass().getMethod().getMethod("test" + whichChild);
method.invoke(obj);
Run Code Online (Sandbox Code Playgroud)

最好在Parent可以调用的接口上有一个方法,并在子类中重写.

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

  public abstract void testChild();
}
Run Code Online (Sandbox Code Playgroud)

然后简单地致电:

obj.testChild();
Run Code Online (Sandbox Code Playgroud)

或者,正如Emanuele Ivaldi指出的那样,只需覆盖testin ChildAChildB直接调用它.