使用带有通用接口的isAssignableFrom()

时间:2013-09-20 20:44:30

标签: java generic-interface

我试图找到一种方法,但我没有发现,如果我的问题已被提出,请告诉我。

基本上我有一个通用接口Evaluator<E, T>,它有一个方法E evaluate(T a, T b),它将由很多类实现(对于每个Evaluator实现,对应一个特定的算法)。使用这些评估程序的类使用XML配置文件来指示要使用的Evaluator类。为了从给定的类名中获取Evaluator,我决定设置一个EvaluatorProvider类,从给定的classe名称构建一个求值程序。

此方法也是通用的:

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

我想确保使用Evaluator找到此名称的类是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 ...

但它给了我关于未经检查的强制转换的警告,我想知道如何考虑为类检查提供的泛型类型(使用isAssignableFrom()或任何其他有效的java机制)。

希望很清楚:)。

PS:如果您对解决方案设计有其他建议,请告诉我,我很想知道在Java中对这样的系统进行建模的最佳方法,而无需运行ServiceProvider模式,这对于项目需求来说太大了。

2 个答案:

答案 0 :(得分:2)

泛型是一个编译时检查,在运行时没有意义。为只有编译器尊重的东西添加运行时检查是没有意义的。

答案 1 :(得分:1)

此信息在编译时被删除。见JLS:

http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.6