异构容器,用于在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