Я пытаюсь использовать одну из простейших форм отражения для создания экземпляра класса:
package some.common.prefix;
public interface My {
void configure(...);
void process(...);
}
public class MyExample implements My {
... // proper implementation
}
String myClassName = "MyExample"; // read from an external file in reality
Class<? extends My> myClass =
(Class<? extends My>) Class.forName("some.common.prefix." + myClassName);
My my = myClass.newInstance();
Приведение типов неизвестно Объект класса, который мы получили от Class.forName
дает предупреждение:
Type safety: Unchecked cast from Class<capture#1-of ?> to Class<? extends My>
Я пробовал использовать подход проверки instanceof
:
Class<?> loadedClass = Class.forName("some.common.prefix." + myClassName);
if (myClass instanceof Class<? extends RST>) {
Class<? extends My> myClass = (Class<? extends My>) loadedClass;
My my = myClass.newInstance();
} else {
throw ... // some awful exception
}
, но это дает ошибку компиляции:
Невозможно выполнить проверку instanceof для параметризованного типа Class расширяет My>. Вместо этого используйте форму Class >, Поскольку дополнительная информация об общем типе будет удалена во время выполнения.
Итак, я полагаю, что не могу использовать подход instanceof
.
Как мне от него избавиться и как я должен это делать правильно? Можно ли вообще использовать отражение без этих предупреждений (то есть без их игнорирования или подавления)?