Java: непроверенный вызов getConstructor (java.lang.Class <?> ...) - PullRequest
16 голосов
/ 10 февраля 2010

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

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 };

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

Есть идеи?

David

Ответы [ 2 ]

21 голосов
/ 10 февраля 2010

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

Class<?> myClassType = Class.forName(className);
Class<?>[] types = new Class[] { File.class };
Constructor<?> cons = myClassType.getConstructor(types);
9 голосов
/ 10 февраля 2010

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

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

Class<?> myClassType = Class.forName(className);
Class<?>[] types = new Class[] { File.class };
Constructor<?> cons = myClassType.getConstructor(types);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...