Ваш метод возвращает тип 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);
}
}
}