Java Generics - Class or Class<? extends SomeCl

2020-03-01 10:33发布

问题:

I am writing a program which will use Java reflection (i.e., Class.forName()) to dynamically create class instance based on user's input. One requirement is that the instance my program creates must extend one specific Class I defined, called it SomeClass. My question is: for storing this class type, should I use bounded generic, Class<? extends SomeClass>, or simply unbounded generic, Class? I found some Java books say that Class is one of the good practices for using unbounded wildcard generic, but I am wondering whether this apply to the situation in my program.

Please feel free to let me know if you found my question is not clear enough or some information is needed.

回答1:

You should use Class<? extends SomeClass> because that's what generics are for.

At the time when you invoke Class.forName, check to see if it SomeClass.class.isAssignableFrom the new class. Otherwise, you should throw an IllegalArgumentException or ClassCastException.

EDIT: Alternatively, calling asSubclass(SomeClass.class) will do this for you.

For example:

public SomeClass instantiate(String name)
  throws ClassNotFoundException, InstantiationException, IllegalAccessException {

    Class<?> raw = Class.forName(name);

    //throws ClassCastException if wrong
    Class<? extends SomeClass> generic = raw.asSubclass(SomeClass.class);

    // do what you want with `generic`

    return generic.newInstance();
}