Класс java.lang.Class
является обобщенным, поэтому вам необходимо параметризовать его. Поскольку вы используете имя класса, во время компиляции невозможно «узнать», что это такое, поэтому на самом деле невозможно ввести тип. Попробуйте следующее:
Class<?> c1 = Class.forName(theName);
return (CalculationFunction) c1.getDeclaredConstructor().newInstance();
обратите внимание, что этот код на самом деле не работает, если вы не отметите конструктор как доступный, если конструктор без аргументов не является publi c, и в этом случае 'getConstructor' больше идиомати c. Приведенный выше код либо бесполезно тупой, либо содержит ошибки.
Я думаю, вы намереваетесь сделать что-то большее, например:
Class<?> c1 = Class.forName(theName);
Constructor<?> ctr = c1.getDeclaredConstructor();
ctr.setAccessible(true);
return (CalculationFunction) ctr.newInstance();
или:
Class<?> c1 = Class.forName(theName);
return (CalculationFunction) c1.getConstructor().newInstance();
j.l.Class
, будучи обобщенным, требует, чтобы вы что-то добавили, или вы получаете предупреждение, но, поскольку вы не знаете, и вы уже выполняете приведение, общие элементы не добавляют много; следовательно, <?>
будет в порядке (и не то, чтобы вы могли поместить туда что-нибудь еще, не получая дополнительных предупреждений).