![](/img/trans.png)
[英]Proof of concept: how I can create a generic comparator method with reflection?
[英]How can I use reflection to build generic subtypes?
我正在使用Factory模式隐藏一些实例创建的复杂性。 我有这个:
class FooInt extends Foo<int>;
我想要做:
class<Foo<?>> fooType = FooInt.class;
Foo的所有派生类型都有一个带有2个参数的构造函数。 因此,我需要使用反射来创建子类型的实例:
Constructor<Foo<?>> ctor = fooType.getContructor(Blah.class, Blahblah.class);
return ctor.newInstance(blah, blahblah);
但是javac说:
"Type mismatch: cannot convert from Class<FooInt> to Class<Foo<?>>"
我究竟做错了什么? 这样可以使用反射吗?
试试: Class<? extends Foo<?>> fooType = FooInt.class;
Class<? extends Foo<?>> fooType = FooInt.class;
另一点是:
Class
不是class
(大写C
); 添加:这是它的工作方式:
public class Foo<T> {
private T value;
public Foo(T value) {
this.value = value;
}
}
public class FooInt extends Foo<Integer>{
public FooInt(Integer value) {
super(value);
}
}
public class FooDouble extends Foo<Double>{
public FooDouble(Double value) {
super(value);
}
}
工厂(至少只有一行,但是有很多例外;-)):
import java.lang.reflect.InvocationTargetException;
public class Factory {
<P, T extends Foo<P>> T build(Class<T> clazz, P param)
throws IllegalArgumentException, SecurityException,
InstantiationException, IllegalAccessException,
InvocationTargetException, NoSuchMethodException {
return clazz.getConstructor(param.getClass()).newInstance(param);
}
public static void main(String[] args)
throws IllegalArgumentException, SecurityException,
InstantiationException, IllegalAccessException,
InvocationTargetException, NoSuchMethodException {
Factory f = new Factory();
System.out.println(f.build(FooInt.class, Integer.valueOf(1)));
System.out.println(f.build(FooDouble.class, Double.valueOf(1.1)));
}
}
我认为拉尔夫就是这个意思。 我个人不认为你应该投
Class<? extends Foo> fooType = FooInt.class;
在Java中,泛型仅在编译时,泛型类型的信息不会在运行时保留。 因此,没有办法使用反射来处理Java中的泛型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.