首先,您可能想要一个完整的通用类
Class<Callable<Integer>> classCI = ...;
那么java类型的系统对于
Class<? extends Callable<Integer>> clazz =
Class.forName(options.valueOf(className))
.asSubclass(classCI);
如何获得classCI
?我们可以通过取消选中的演员阵容来作弊
Class<Callable<Integer>> classCI = (Class<Callable<Integer>>)Callable.class;
这本质上是不安全的。必须有外力来确保className
真的是Callable<;整数>代码>。例如,如果它是一个<code>可调用<;字符串>
时,该程序运行所有的强制转换都没有任何问题,而且只有在调用Integer call()
时才会崩溃,错误消息会非常误导。
如果不能静态分析强制转换以使其成功,也没关系:
Object o = ...;
String s1 = (String)o; // may fail, no javac warning
String s2 = String.class.cast(o); // may fail, no javac warning
只要在运行时强制转换失败时立即引发异常。
为了确保类型安全,我们必须主动检查className
的泛型类型
@SuppressWarning( "unchecked" )
Class<? Callable<Integer>> getClass(String className)
{
Class clazz = Class.forName(className);
via reflection, check generic super interfaces of clazz
if there s no Callable<Integer> super interface
throw "className is not a Callable<Integer>"
// we have *checked*, the following cast is safe
return (Class<? Callable<Integer>>)clazz;
}
我们有理由在这里取消“unchecked”,因为实现会检查,以确保如果className
并没有真正表示实现Callable<;整数>
,它立即在那里抛出一个异常。我们的演员阵容经过“检查”,程序是类型安全的。