我试图从Effective Java跟随Joshua Bloch的类型安全异构容器模式来创建一个对象容器(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));
}
}
Run Code Online (Sandbox Code Playgroud)
问题在于getFromContainer我必须执行未经检查的强制转换.在Josh Bloch的容器中,他表演了一个安全演员 - 但就我而言,我看不出这是怎么回事.
有没有人有任何想法?
干杯,尼克.
在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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4471 次 |
| 最近记录: |