代码之家  ›  专栏  ›  技术社区  ›  Michael Ekstrand

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

  •  0
  • Michael Ekstrand  · 技术社区  · 15 年前

    给定Guice类型文本 TypeLiteral<T> template 还有一个班级 Class c 实现或扩展 T ,构造类型 Type t 相当于 c 将所有类型变量实例化以便与 template .

    如果 c类 没有类型变量,很简单; c类 是所讨论的类型。但是,如果 有类型变量,则需要执行以下操作:

    1. c类 的原始类型对应的继承和实现层次结构 T型
    2. 遍历类型参数结构,在 模板
    3. 用伪装 Types 从中创建类型的帮助函数 c类

    当然,也有错误的情况,可能不完整。如果它找不到所有类型变量的匹配用法,它将失败。可能还有其他情况。但是,如果我有这个:

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

    和一个文本类型 TypeLiteral<S<Map<I,Float>>> ,我想得到一个表示 CS 完全实例化以匹配类型文本。

    看起来反射提供了足够的信息来实现这一点,但是逻辑看起来很复杂并且容易出错。是否有一个现有的库公开了这种逻辑?

    2 回复  |  直到 15 年前
        1
  •  0
  •   Jesse Wilson    15 年前

    TypeLiteral.getSupertype() 应该这样做:

    TypeLiteral<?> t = TypeLiteral.get(x).getSupertype(y);
    
        2
  •  0
  •   Michael Ekstrand    15 年前

    这个问题是统一问题的一个实例,因此标准 unification algorithm