I'm trying to use one of the simplest forms of reflection to create an instance of class:
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();
Typecasting unknown Class object we've got from Class.forName
yields a warning:
Type safety: Unchecked cast from Class<capture#1-of ?> to Class<? extends My>
I've tried using instanceof
check approach:
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
}
but this yields a compilation error:
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.
So I guess I can't use instanceof
approach.
How do I get rid of it and how am I supposed to do it properly? Is it possible to use reflection without these warnings at all (i.e. without ignoring or supressing them)?