gpt4 book ai didi

java - 如何使用反射来构建通用子类型?

转载 作者:行者123 更新时间:2023-12-02 00:43:58 25 4
gpt4 key购买 nike

我使用工厂模式来隐藏一些实例创建的复杂性。我有这个:

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)类型为 Class不是class (大写 C );
  • 不能在泛型中使用基数(使用 Integer 而不是 int)
<小时/>

添加:这就是它的工作原理:

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);
}
}

工厂(至少只有一行,但有很多异常(exception);-)):

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)));
}
}

关于java - 如何使用反射来构建通用子类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5515027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com