Re: Yet another generics question: Needs unchecked conversion to
conform to ...
Michel T. wrote:
My first suggestion is not to use reflection.
I have to use reflection. This example is a very-reduced sample that
does not reflect the reality where this is required. I created this
simple class to show the warning.
If not, does BeanFactory<? extends Bean> work for you? (There is no
guarantee that the T in a subclass of BeanFactory is exactly Bean.)
I would not mind changing the return value of createFactory2 to
BeanFactory<? extends Bean> createFactory2(String beanClass)
but I get the same warning.
Rather strangely it requires an intermediate variable. I have no idea
why. Captures are odd.
import java.lang.reflect.*;
public class Generics {
public BeanFactory<?> createFactory(
String beanClassName
) throws
NullPointerException,
LinkageError,
ExceptionInInitializerError,
ClassNotFoundException,
ClassCastException,
NoSuchMethodException,
SecurityException,
InstantiationException,
IllegalAccessException,
IllegalArgumentException,
InvocationTargetException
{
Class<?> rawClass = Class.forName(beanClass);
Class<? extends BeanFactory> clazz =
rawClass.asSubclass(BeanFactory.class);
Constructor<? extends BeanFactory> ctor =
clazz.getConstructor(new Class[] { });
BeanFactory erased = ctor.newInstance(new Object[] { });
BeanFactory<?> reified = erased;
return reified;
}
public class BeanFactory<T extends Bean>{
}
public class Bean{
}
}
Alternatively, create a bean factory factory. (But stick with using a
Constructor rather than evil Class.newInstance.)
I must use reflection to instantiate the factory. Otherwise, I would
not be posting that question ;)
Why must?
What I mean was to create something like:
class BeanFactoryFactory {
public BeanFactory<?> createFactory();
}
And Generics.createFactory would become:
public BeanFactory<?> createFactory(String beanClassName) {
BeanFactoryFactory factoryFactory = ... beanClassName ...
return factoryFactory.createFactory();
}
Tom Hawtin