繁体   English   中英

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

[英]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 Type是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM