Подтвердить что ты не робот

Java: непроверенный вызов getConstructor (java.lang.Class <?>...)

Я использую отражение для построения класса (ConfigBuilder), который принимает файл как аргумент:

Class myClassType = Class.forName(className);
Class[] types = new Class[] { File.class };
Constructor cons = myClassType.getConstructor(types);
Object[] constructorArgs = new Object[] { myFile };
cb = (ConfigBuilder) cons.newInstance(constructorArgs);

но я получаю это предупреждение:

warning: [unchecked] unchecked call to getConstructor(java.lang.Class<?>...) as a member of the raw type java.lang.Class
Constructor cons = myClassType.getConstructor(types);

Очевидно, кажется, что getConstructor ожидает общий тип, поэтому я попробовал что-то вроде:

Class<?>[] types = new Class<?>[] { File.class };

но я получаю такое же предупреждающее сообщение

Любая идея?

Дэвид

4b9b3361

Ответ 1

Предупреждение на самом деле относится к myClassType. Вам нужно также параметризовать его (и cons).

Class<?> myClassType = Class.forName(className);
Class<?>[] types = new Class[] { File.class };
Constructor<?> cons = myClassType.getConstructor(types);

Ответ 2

Во-первых, это просто предупреждение и не должно вызывать чрезмерной тревоги при работе с отражением и типами, которые неизвестны во время компиляции. Достоинством дженериков является более сильная проверка типа времени компиляции и все, что выходит из окна после вызова Class.forName(className).

Однако, если вы похожи на большинство людей (включая меня), то вы, вероятно, захотите избавиться от предупреждения, чтобы оно не продолжало привлекать вас внимание излишне. Для этого вы можете параметризовать переменную конструктора cons:

Class<?> myClassType = Class.forName(className);
Class<?>[] types = new Class[] { File.class };
Constructor<?> cons = myClassType.getConstructor(types);