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

Nic*_*ght 13 java generics

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

有没有人有任何想法?

干杯,尼克.

irr*_*ble 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
Run Code Online (Sandbox Code Playgroud)