如何为给定TypeLiteral的类重建泛型类型信息?

时间:2010-10-14 19:09:34

标签: java generics guice type-erasure

我有以下问题:

  

鉴于Guice类型文字TypeLiteral<T> template和类Class c实现或扩展T,构建类型为Type t的类型c,所有类型变量实例化以便与template兼容。

如果c没有类型变量,那很简单; c是有问题的类型。但是,如果c有类型变量,那么我需要执行以下操作:

  1. c的原始类型对应的T的继承和实现层次结构中查找类型
  2. 浏览类型参数结构,在template
  3. 中查找任何类型变量的使用及其对应的类型
  4. 使用Guice Types辅助函数从c创建一个类型,该类型使用(2)中找到的类型进行实例化。
  5. 当然,有错误的情况,可能不完整。如果找不到所有类型变量的匹配用法,它将失败。可能还有其他情况。但是,如果我有这个:

    class CS<I> implements S<Map<I,Float>> {
        // some stuff
    }
    

    和类型文字TypeLiteral<S<Map<I,Float>>>,我希望得到一个代表CS的类型,完全实例化以匹配类型文字。

    看起来反射提供了足够的信息来实现这一点,但逻辑看起来很复杂且容易出错。是否存在暴露此逻辑的现有库?

2 个答案:

答案 0 :(得分:0)

TypeLiteral.getSupertype()应该这样做:

TypeLiteral<?> t = TypeLiteral.get(x).getSupertype(y);

答案 1 :(得分:0)

这个问题是统一问题的一个例子,因此标准unification algorithm是适用的,并不像我最初想的那么复杂。此外,该问题的实例允许一些显着的简化假设,因为其中一个树将不包含变量。后来有200行Java,我有一个可行的解决方案。