【问题标题】:Heterogeneous container to store genericly typed objects in Java用于在 Java 中存储泛型类型对象的异构容器
【发布时间】:2011-06-07 03:57:09
【问题描述】:

我正在尝试遵循来自 Effective Java 的 Joshua Bloch 的类型安全异构容器模式,以 Class<T> 作为键创建对象容器 (MyGeneric<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 的容器中,他执行了一个安全施法 - 但就我而言,我看不出这是怎么可能的。

有人有什么想法吗?

干杯, 尼克。

【问题讨论】:

    标签: java generics


    【解决方案1】:

    在 Bloch 的版本中,使用了 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
    

    【讨论】:

    • 谢谢。最好的做法是抑制由此生成的“未检查”警告,还是将其保留为注释以突出显示给将来可能想要更新课程的任何其他人?
    • 好的 - 对于那些感兴趣的人,我取消了警告并添加了评论! N
    猜你喜欢
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多