异构容器,用于在Java中存储通用类型的对象

时间:2011-05-26 13:33:22

标签: java generics

我试图关注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的容器中,他表演了一个安全演员 - 但就我而言,我看不出这是怎么回事。

有人有任何想法吗?

干杯, 尼克。

1 个答案:

答案 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