2010-10-14 70 views
0

我有以下问题:如何重建给定TypeLiteral的类的泛型类型信息?

给定一个吉斯类型字面TypeLiteral<T> template和执行或延伸TClass c,构造一个类型Type t这相当于c与实例化的,以便与template兼容的所有类型变量。

如果c没有类型变量,很容易; c是有问题的类型。但是,如果c有类型的变量,那么我需要做到以下几点:

  1. c的继承,并通过类型参数结构对应的原始类型T
  2. 走的实现层次查找的类型,在template中找到任何类型的变量用法及其对应类型
  3. 使用Guice Types辅助函数创建一个从(2)中找到的类型实例化的c的类型。

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

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

和类型文本TypeLiteral<S<Map<I,Float>>>,我想这代表CS完全实例化,以匹配文字类型的类型。

它看起来像反射提供了足够的信息来实现这一点,但逻辑看起来很复杂和容易出错。是否有一个现有的库显示这个逻辑?

回答

0

这个问题是统一问题的一个实例,因此标准unification algorithm适用,正如我最初以为并不复杂。此外,这个问题的实例允许一些重要的简化假设,因为其中一棵树将不包含变量。以后200行Java,我有一个工作解决方案。

0

TypeLiteral.getSupertype()应该做的伎俩:

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

我试过'template.getSupertype(c)',但它抱怨'c'不是'T'的超类型(这是事实,因为它是'T'的子类型)。 – 2010-10-15 16:45:38