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

问题描述

|| 我正在尝试使用来自有效Java的Joshua Bloch的类型安全异构容器模式来创建以ѭ1为主键的对象容器(
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)的容器中,他进行了安全的投射-但就我而言,我看不出如何做到这一点。 有人有什么想法吗? 干杯, 缺口。     

解决方法

在Bloch的版本中,使用
Class.cast()
-实现为
return (T) obj
,即未经检查的演员表。从某种意义上说,这是作弊行为,即有关未检查的强制转换的编译器警告已移至预编译的库中。强制转换的类型安全不受编译器保护,但由应用程序逻辑保护。 您也不必担心未经检查的演员表。有些类型关系不能用语言表达,但是程序员知道是真的。因此,只需否决编译器,告诉它强制转换是安全的。 更正 我对“未经检查的演员”的理解不正确。
Class.cast()
不包含\“ unchecked cast \”。强制转换是在“检查”之后完成的,如果在运行时达到强制转换,则可以保证成功。
T cast(Object obj)
    if obj is instance of this class   // check
        return (T)obj;                 // cast 
    else
        throw new ClassCastException
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...