我有一个具有内部Class属性的C类:
public class C{
private Class<?> clazz;
public void setClazz(Class<?> c){
this.clazz = c;
}
public Class<?> getClazz(){
return clazz;
}
}
Run Code Online (Sandbox Code Playgroud)
我想在另一个类中声明一个方法,所以它的返回类型是C.clazz的类型:
public class D{
public <T> T getInstance(C c){
//doesn't compile
//some reflective code to set T to c.getClazz?
return (c.getClazz.newInstance());
}
}
Run Code Online (Sandbox Code Playgroud)
所以,例如,getInstance(c),c将clazz设置为Class<B>,将返回一个新的B实例.有没有办法用反射做到这一点?
class C<T>{
private final Class<T> clazz;
C(Class<T> clazz) {
this.clazz = clazz;
}
public Class<T> getClazz(){
return clazz;
}
}
class D{
public <T> T getInstance(C<T> t) throws IllegalAccessException, InstantiationException {
return t.getClazz().newInstance();
}
}
public static void main() throws Exception {
C<String> c = new C<>(String.class);
D d = new D();
String s = d.getInstance(c);
System.out.println("String = " + s);
}
Run Code Online (Sandbox Code Playgroud)
这也是存储泛型类型信息的经典方式.但我不明白为什么你想要getInstace方法里面D.我宁愿把它变成一个静态方法C.
您可以调整类似的策略,即使它是一个阵列java.lang.reflect.Array.newInstance(t.getClazz(),10);而不仅仅是t.getClazz().newInstance()
甚至还有其他方法可以捕获泛型类型信息.阅读本文以获取更复杂的内容.
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |