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)
可以做我想做的事吗?如果是,我如何将此对象转换为传递的类型?
不确定你正在做什么,但你可以使用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)
如果添加约束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)
但是,您仍然无法调用testChildA
etc方法,因为您拥有的只是一个实例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指出的那样,只需覆盖test
in ChildA
并ChildB
直接调用它.
归档时间: |
|
查看次数: |
12062 次 |
最近记录: |