Я пытаюсь использовать одну из самых простых форм отражения для создания экземпляра класса:
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
}
, но это приводит к ошибке компиляции: Cannot perform instanceof check against parameterized type Class<? extends My>. Use the form Class<?> instead since further generic type information will be erased at runtime.
Так что я не могу использовать instanceof
подход.
Как мне избавиться от этого и как я должен делать это правильно?Можно ли вообще использовать отражение без этих предупреждений (т.е. без их игнорирования или подавления)?