我有以下问题:
鉴于Guice类型文字
TypeLiteral<T> template
和类Class c
实现或扩展T
,构建类型为Type t
的类型c
,所有类型变量实例化以便与template
兼容。
如果c
没有类型变量,那很简单; c
是有问题的类型。但是,如果c
有类型变量,那么我需要执行以下操作:
c
的原始类型对应的T
的继承和实现层次结构中查找类型
template
Types
辅助函数从c
创建一个类型,该类型使用(2)中找到的类型进行实例化。当然,有错误的情况,可能不完整。如果找不到所有类型变量的匹配用法,它将失败。可能还有其他情况。但是,如果我有这个:
class CS<I> implements S<Map<I,Float>> {
// some stuff
}
和类型文字TypeLiteral<S<Map<I,Float>>>
,我希望得到一个代表CS
的类型,完全实例化以匹配类型文字。
看起来反射提供了足够的信息来实现这一点,但逻辑看起来很复杂且容易出错。是否存在暴露此逻辑的现有库?
答案 0 :(得分:0)
TypeLiteral.getSupertype()应该这样做:
TypeLiteral<?> t = TypeLiteral.get(x).getSupertype(y);
答案 1 :(得分:0)
这个问题是统一问题的一个例子,因此标准unification algorithm是适用的,并不像我最初想的那么复杂。此外,该问题的实例允许一些显着的简化假设,因为其中一个树将不包含变量。后来有200行Java,我有一个可行的解决方案。