异构容器,用于在Java中存储通用类型的对象
我试图从Effective Java跟随Joshua Bloch的类型安全异构容器模式来创建一个以Class
为键的对象容器( MyGeneric
)。
public class MyClass { private Map<Class, MyGeneric> myContainer = new HashMap<Class, MyGeneric>(); public void addToContainer(Class class, MyGeneric thing) { myContainer.put(class, thing); } public MyGeneric getFromContainer(Class class) { return (MyGeneric)(myContainer.get(klass)); } }
问题在于getFromContainer我必须执行未经检查的强制转换。 在Josh Bloch的容器中,他表演了一个安全演员 – 但就我而言,我看不出这是怎么回事。
有没有人有任何想法?
干杯,尼克。
在Bloch的版本中,使用了Class.cast()
– 它被实现为return (T) obj
,一个未经检查的强制转换。 从某种意义上说,编译器关于未经检查的强制转换的警告会被移动到预编译的lib中。 演员的类型安全性不受编译器的保护,而是由应用程序逻辑保护。
您也不应该担心未经检查的演员表。 有些类型的关系不能用语言表达,但程序员知道这是真的。 所以只是否决编译器,告诉它演员是安全的。
更正
我对“未经检查的演员”的理解是不正确的。
Class.cast()
不包含“unchecked cast”。 在“检查”之后完成转换,如果在运行时达到转换,则保证成功。
T cast(Object obj) if obj is instance of this class // check return (T)obj; // cast else throw new ClassCastException