我试图关注Joshua Bloch的Effective Java中的类型安全异构容器模式,以MyGeneric<T>
为关键创建一个对象容器(Class<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的容器中,他表演了一个安全演员 - 但就我而言,我看不出这是怎么回事。
有人有任何想法吗?
干杯, 尼克。
答案 0 :(得分:9)
在Bloch的版本中,使用Class.cast()
- 实现为return (T) obj
,未经检查的强制转换。从某种意义上说,编译器有关未经检查的强制转换的警告会被移动到预编译的lib中。编译器的类型安全性不受编译器的保护,而是由应用程序逻辑保护。
您也不应该担心未经检查的演员表。类型关系不能用语言表达,但程序员知道这是真的。所以只是否决编译器,告诉它演员是安全的。
<强>校正强>
我对“未选中的演员”的理解不正确。
Class.cast()
不包含“未选中的演员”。在“检查”之后完成转换,如果在运行时达到转换,则保证成功。
T cast(Object obj)
if obj is instance of this class // check
return (T)obj; // cast
else
throw new ClassCastException