Вы создали универсальный метод, объявив T
в качестве параметра типа с верхней границей.При использовании общих методов вы должны знать, что вызывающая сторона может решить, что такое T
, передав явный аргумент типа в ваш метод.
class ClassC extends ClassA {}
ClassC c = new Factory().<ClassC>create();
Нет гарантии, что параметр типа, выбранный вызывающей стороной,явно или неявно, будет соответствовать типу того, что возвращается, и вы возвращаете ClassB
.Компилятор не может гарантировать безопасность типов здесь, поэтому это запрещено.
Если вам не нужны обобщенные значения, удалите параметр типа из метода и объявите create
, чтобы вернуть ClassB
, ClassA
,или Object
.
Если вам нужны универсальные шаблоны, то вы должны взять параметр типа Class<T>
и создать с ним экземпляр для удовлетворения компилятора.
public <T extends ClassA> T create(Class<T> clazz) throws ReflectionRelatedExceptions
{
return clazz.getConstructor().newInstance();
}