Warm tip: This article is reproduced from serverfault.com, please click

其他-Java中的泛型和反射。

(其他 - Generics and reflection in Java. Classes)

发布于 2020-12-01 07:09:18

我有一个任务,我必须实现创建给定类的对象的方法。

class Paper {}

class Bakery {}

class Cake extends Bakery {}

class ReflexiveBaker {
  
  /**
   * Create bakery of the provided class.
   * 
   * @param order class of bakery to create
   * @return bakery object
   */
  public Object bake(Class order) {
    // Add implementation here
  }
  
}

我应该如何正确实现此方法?我想以这种方式做到这一点

public <T extends Bakery> T bake(Class<T> order) {
        try {
            return order.getDeclaredConstructor().newInstance();
        } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
            e.printStackTrace();
        }
    }

但是它总是抛出NoSuchMethodException。此外,从任务``确保Bakery的所有子类都将具有公共无参数构造函数''。而且InvocationTargetException没有导入到任务中,因此应在没有任务的情况下实现。有什么问题?

Questioner
qwoke
Viewed
0
Octavian R. 2020-12-01 15:39:47

这是怎么做的。你必须用getDeclaredConstructor()

class Paper {
}

class Bakery {
}

class Cake extends Bakery {
}

class ReflexiveBaker {

    /**
     * Create bakery of the provided class.
     *
     * @param order class of bakery to create
     * @return bakery object
     */
    public static <T extends Bakery> T bake(Class<T> order) {
        try {
            return order.getDeclaredConstructor().newInstance();
        } catch (Exception e) {
            throw new RuntimeException("Failed to instantiate class of type " + order, e);
        }
    }

}

用法

public static void main(String[] args) {
    Cake cake = ReflexiveBaker.bake(Cake.class);
    System.out.println(cake.getClass());
}