代码之家  ›  专栏  ›  技术社区  ›  mgamer

guice的TypeLiteral是如何工作的?

  •  27
  • mgamer  · 技术社区  · 14 年前

    Guice的TypeLiteral如何克服Java泛型擦除过程?

    它的工作奇迹,但如何做到这一点?

    2 回复  |  直到 14 年前
        1
  •  29
  •   sumitsu    10 年前

    这里使用的技巧是泛型超类型的签名存储在子类中,因此 幸存 擦除。

    new TypeLiteral<List<String>>() {} Guice可以打电话 getClass().getGenericSuperclass() 在上面找一个 java.lang.reflect.ParameterizedType 存在一个方法 getActualTypeArguments() List<String> ParameterizedType .

        2
  •  8
  •   Mike Q    14 年前

    通过匿名类型、子类化和Java没有完全删除所有泛型声明的事实的结合。

    如果仔细观察,TypeLiteral有一个受保护的构造函数,那么在构造一个新的{}时,您将使用一个额外的{},这个{}将创建TypeLiteral的匿名子类。

    在Java中,泛型声明保存在类和方法声明上,所以如果我写这个。

    public abstract class Class1<T>
    {
    }
    
    public class Class2 extends Class1<Integer>
    {
    }