gpt4 book ai didi

Java泛型和反射: class loading

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

我被教授了一些我不知道的类(class)。其中一些作为示例显示:

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 类或其任何子类的对象
  • 如果 order 参数不是 Bakery 或其任何子类(例如,如果它是 Paper 或 Object),则标记编译时错误

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

我想出的最好的办法是:

public Object bake(Class<? extends Bakery> order) throws Exception {
return order.getDeclaredConstructor().newInstance();
}

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

最佳答案

你的方法返回类型是java.lang.Object,编译器不能保证返回值是Cake类型,除非你通过添加一个像这样显式未经检查的强制转换。

Cake cake = (Cake) ReflexiveBaker.bake(Cake.class);

这种未经检查的转换很容易出错并且很尴尬。假设您有另一个名为 Bread 的类,它是 Bakery 的子类型,并且您传递该类实例,期望 Cake 作为返回类型。上面的语句仍然可以编译,但在运行时抛出 ClassCastException

更好的方法是使用有界类型参数来泛化该方法,使其仅接受 Bakery 的子类型,并返回与所提供的类对象的类型参数相同的类型。这是一次这样的尝试。

static class ReflexiveBaker {
public static <T extends Bakery> T bake(Class<T> order) {
try {
return order.getDeclaredConstructor().newInstance();
} catch (NoSuchMethodException | InstantiationException | IllegalAccessException
| InvocationTargetException e) {
throw new AssertionError("Class could not be instantiated.", e);
}
}
}

关于Java泛型和反射: class loading,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59765791/

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