问题描述
||
我正在尝试使用来自有效Java的Joshua Bloch的类型安全异构容器模式来创建以ѭ1为主键的对象容器(
MyGeneric<T>
)。
public class MyClass {
private Map<Class<?>,MyGeneric<?>> myContainer =
new HashMap<Class<?>,MyGeneric<?>>();
public <T> void addToContainer(Class<T> class,MyGeneric<T> thing) {
myContainer.put(class,thing);
}
public <T> MyGeneric<T> getFromContainer(Class<T> class) {
return (MyGeneric<T>)(myContainer.get(klass));
}
}
问题是在getFromContainer中,我必须执行未经检查的强制转换。在乔什·布洛赫(Josh Bloch)的容器中,他进行了安全的投射-但就我而言,我看不出如何做到这一点。
有人有什么想法吗?
干杯,
缺口。
解决方法
在Bloch的版本中,使用
Class.cast()
-实现为return (T) obj
,即未经检查的演员表。从某种意义上说,这是作弊行为,即有关未检查的强制转换的编译器警告已移至预编译的库中。强制转换的类型安全不受编译器保护,但由应用程序逻辑保护。
您也不必担心未经检查的演员表。有些类型关系不能用语言表达,但是程序员知道是真的。因此,只需否决编译器,告诉它强制转换是安全的。
更正
我对“未经检查的演员”的理解不正确。
Class.cast()
不包含\“ unchecked cast \”。强制转换是在“检查”之后完成的,如果在运行时达到强制转换,则可以保证成功。
T cast(Object obj)
if obj is instance of this class // check
return (T)obj; // cast
else
throw new ClassCastException