Java泛型和反射:类加载

问题描述 投票:0回答:1

我获得了一些我不知道的课程。其中一些作为示例显示:

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
  }

}

任务是根据需要重新设计方法签名类型并添加实现。烘焙方法应符合以下条件:

  • 根据类参数创建Bakery类或其任何子类的对象
  • 如果订单参数不是Bakery或其任何子类(例如,它是Paper或Object),则标记编译时错误

无论我尝试过什么,都会遇到错误:Main.java ::错误:类型不兼容:对象无法转换为Cake蛋糕蛋糕= baker.bake(Cake.class);

我想出的最好的方法是:

公共对象烘烤(类顺序)抛出异常{返回order.getDeclaredConstructor()。newInstance();

我知道这是错误的,但我完全被困在这里。有人可以解释发生了什么吗?

java generics reflection
1个回答
0
投票

您的方法返回无法转换为Cake的java.lang.Object。您必须对方法进行泛化,使其仅接受Bake的子类型,并返回与提供的类实例的参数化类型相同的类型。这是它的外观。

static class ReflexiveBaker {
    public static <T extends Bakery> T bake(Class<T> order) {
        try {
            return order.getDeclaredConstructor().newInstance();
        } catch (NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException
                | IllegalArgumentException | InvocationTargetException e) {
            System.out.println("Class instance could not be instantiated.");
        }
        throw new AssertionError();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.