由于Java中的泛型是使用擦除来实现的,因此的类型信息
FruitHandlerFactory将在运行时不可用,这意味着您无法以这种方式实例化
A(或
B)。
但是,您 可以 传入
Class正确类型的对象来解决此问题:
public class FruitHandlerFactory<H extends FruitHandler<F>, F extends Fruit> { final Class<H> handlerClass; final Class<F> fruitClass; public FruitHandlerFactory(final Class<H> handlerClass, final Class<F> fruitClass) { this.handlerClass = handlerClass; this.fruitClass = fruitClass; } public H create() throws InstantiationException, IllegalAccessException { H handler = handlerClass.newInstance(); handler.setFruit(fruitClass.newInstance()); return handler; }}一个较小的缺点是,如果要实例化a,则必须写三遍类型名称(1)
FruitHandlerFactory:
FruitHandlerFactory fhf = new FruitHandlerFactory<OrangeHandler,Orange>(OrangeHandler.class, Orange.class);
您可以通过
static
createFactory()在您的方法上生成一个方法来减少这种情况
FruitHandlerFactory:
static <H extends FruitHandler<F>, F extends Fruit> FruitHandlerFactory<H, F> createFactory( final Class<H> handlerClass, final Class<F> fruitClass) { return new FruitHandlerFactory<H, F>(handlerClass, fruitClass);}并像这样使用它:
FruitHandlerFactory fhf = FruitHandlerFactory.createFactory(OrangeHandler.class, Orange.class);



