我正在尝试遵循 Effective Java 中 Joshua Bloch 的类型安全异构容器模式来创建对象容器 ( MyGeneric<T>
) 和 Class<T>
作为 key 。
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
,一个未经检查的转换。从某种意义上说,关于未经检查的转换的编译器警告被移动到预编译的库中,这是一种作弊。转换的类型安全性不受编译器保护,而是由应用程序逻辑保护。
您也不应该担心未经检查的转换。有些类型关系无法用语言表达,但程序员知道它们是真实的。因此,只需否决编译器,告诉它转换是安全的。
更正
我对“unchecked cast”的理解是错误的。
Class.cast()
不包含“未经检查的转换”。强制转换是在“检查”之后完成的,如果在运行时达到强制转换,则保证成功。
T cast(Object obj)
if obj is instance of this class // check
return (T)obj; // cast
else
throw new ClassCastException
关于java - 用于在 Java 中存储通用类型对象的异构容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6139325/