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

标签 java generics

我正在尝试遵循 Effective Java 中 Joshua Bloch 的类型安全异构容器模式来创建对象容器 ( MyGeneric<T> ) 和 Class<T>作为 key 。

  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 的容器中,他进行了安全转换 - 但就我而言,我看不出这是怎么可能的。

有没有人有什么想法?

干杯, 尼克。

最佳答案

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

您也不应该担心未经检查的转换。有些类型关系无法用语言表达,但程序员知道它们是真实的。因此,只需否决编译器,告诉它转换是安全的。

更正

我对“unchecked cast”的理解是错误的。

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

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

关于java - 用于在 Java 中存储通用类型对象的异构容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6139325/

相关文章:

delphi - 如何实现IEnumerable<T>?

java - 无法从 bootstrap.yml 读取配置服务器 uri

java - Jackson:如何获取完整的 JSON 字符串,该字符串在序列化或反序列化过程中进行解析

java - 将 MD5 - base64 从 JAVA 转换为 PHP

java - 使用泛型无需强制转换观察者模式

java - 处理泛型方法中的特定类型采用并返回相同的泛型类型

java - 当在客户端 GWT 模块中调用时,System.out.println() 消息去哪里了?

java - 设置恶意 xml 的 Apache CXF 总线属性

java - 使用参数化(通用)Java 类与普通类

java - 泛型类型的类参数