我有两个类UpObj和DownObj
public class UpObj {
public UpObj() {
System.out.println("Load UpObj ");
}
}
public class DownObj extends UpObj {
public DownObj() {
System.out.println("Load DownObj ");
}
}
public class Caller {
UpObj obj;
public Caller(UpObj obj) {
this.obj = obj;
System.out.println("!!!");
}
}
public class GNUMakeFile {
/**
* @param args
*/
public static void main(String[] args) {
DownObj iView = new DownObj();
Class<?> iViewClass = iView.getClass();
Class<?> clazz;
try {
clazz = Class.forName("bla.bla.bla.Caller");
Constructor<?> ctor = clazz.getDeclaredConstructor(iViewClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
所以,我希望upcast我的孩子在Caller构造函数中键入DownObj to parent UpObj。 我认为这可以通过帮助泛型来实现。像这样的东西。 任何人都知道这是如何使用的。
感谢。
答案 0 :(得分:0)
没有标准的做法。尝试谷歌搜索一些解决方案,例如http://www.xinotes.org/notes/note/1329/或How to get parameter types using reflection?。我记得Spring和其他一些库有类似的util函数来做。你使用Spring吗?
答案 1 :(得分:0)
您不应该将Class.getConstructor()
与您想要传递给它的运行时类型一起使用 - 该方法可以使用形式参数。
如果您需要搜索与您拥有的某些对象匹配的构造函数,则必须循环getConstructors()
,检查每个构造函数的形式参数,并使用{检查是否找到了合适的签名{3}}。我认为没有一种方便的方法让反射API为你做重载解析。
(或者,重新考虑你的方法,因此不再需要弄乱反思。)
答案 2 :(得分:0)
我真的不明白这个问题 - 通常不需要向上转换
但它的问题就是获得对象的上层类
如果使用getSuperclass
方法:
Constructor<?> ctor = clazz.getDeclaredConstructor(iViewClass.getSuperclass());