我试图找到一种方法,但我没有发现,如果我的问题已被提出,请告诉我。
基本上我有一个通用接口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模式,这对于项目需求来说太大了。答案 0 :(得分:2)
泛型是一个编译时检查,在运行时没有意义。为只有编译器尊重的东西添加运行时检查是没有意义的。
答案 1 :(得分:1)
此信息在编译时被删除。见JLS:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.6