javageneric-interface

Using isAssignableFrom() with generic interface


I try to find a way to do it but i didn't find out, please let me know if my question has already been asked.

Basically i have a generic interface Evaluator<E, T> with a single method E evaluate(T a, T b) which will be implemented by lot of classes (for each Evaluator implementation correspond a specific algorithm). The class which use those evaluators use an XML configuration file which indicate which Evaluator class to use. To get an Evaluator from a given class name i decided to set a EvaluatorProvider class which build a evaluator from a given classe name.

This method is also generic :

public static <E, T> Evaluator<E, T> newInstance(String className)

I want to ensure that the class found for this name is a valid subclass of Evaluator using isAssignableFrom() :

    Evaluator<E, T> evaluatorInstance = null;
    try {
        Class<?> evaluatorClass = Class.forName(className);
        if (!Evaluator.class.isAssignableFrom(evaluatorClass)) {

        }
        evaluatorInstance = (Evaluator<E, T>) evaluatorClass.newInstance();
    }
    // Catch clause, etc ...

But it gives me a warning about unchecked cast, i was wondering then how to take in account the generic type provided for the class checking (using isAssignableFrom() or any other valid java mecanism).

Hope it was clear :).

PS : If you have other suggestion for the solution design please let me know, i am curious about the best way to modelize such system in Java, without run in ServiceProvider pattern which is too big for the project need.


Solution

  • Generics are a compile time check and are not meaningful at runtime. It doesn't make sense to add a runtime check for something only the compiler honours.