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

2022-09-03 15:32:35

我试图遵循Joshua Bloch的Typesafe hetereogene容器模式,从 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

在布洛赫的版本中,使用 - 它被实现为,一个未经检查的转换。从某种意义上说,这是作弊,因为编译器警告未经检查的强制转换被移动到预编译的库。强制转换的类型安全性不是由编译器保护的,而是由应用逻辑保护的。Class.cast()return (T) obj

您也不必担心未经检查的投射。有些类型关系不能用语言表达,但程序员知道这些关系是正确的。因此,只需推翻编译器,告诉它强制转换是安全的。

校正

我对“不受约束的演员阵容”的理解是不正确的。

Class.cast()不包含“未选中的投射”。强制转换是在“检查”之后完成的,如果在运行时达到强制转换,则保证会成功。

T cast(Object obj)
    if obj is instance of this class   // check
        return (T)obj;                 // cast 
    else
        throw new ClassCastException

答案 2

推荐