如何使用 Google 的 Guava 库在 Java 中提取泛型类型

How to extract a generic type in Java using Google's Guava library

我正在尝试使用 Google 的 Guava TypeToken 库查找通用类型。我无法找到使用正确参数提取我想要的类型的实际调用。

public class BaseEntity { }
public class BaseResource { }
public class EntityService<E extends BaseEntity, R extends BaseResource> { }

public class TestEntity extends BaseEntity { }
public class TestResource extends BaseResource { }
public class TestEntityService extends EntityService<TestEntity, TestResource> { }

public class EntityRsqlPredicateBuilder<
  S extends EntityService<E, R>, 
  E extends BaseEntity, 
  R extends BaseResource> 
{
  EntityRsqlPredicateBuilder() {
    // I would like to get the the class type for E (i.e. TestEntity.class) 
    Class<E> entityClass = ???
  }
}

// in code, use EntityRsqlPredicateBuilder
EntityRsqlPredicateBuilder<TestEntityService> = new EntityRsqlPredicateBuilder();

我的备份策略只是将 class 传递给 EntityRsqlPredicateBuilder。但是,当类型应该已知时,这似乎是代码重复。

感谢任何有关如何执行此操作的想法。

TypeToken 无法按照您尝试做的方式做您想做的事情——什么都做不到。由于类型擦除,您当前编写代码的方式将不可避免地丢失该信息。

但是,TypeToken 文档确实向您展示了如何做一些与您尝试做的事情相近的事情:

Capture a generic type with a (usually anonymous) subclass and resolve it against a context class that knows what the type parameters are. For example:

  abstract class IKnowMyType<T> {
     TypeToken<T> type = new TypeToken<T>(getClass()) {};
   }
   new IKnowMyType<String>() {}.type => String

因此,如果您将 EntityRsqlPredicateBuilder 抽象化,然后使用 new EntityRsqlPredicateBuilder<TestEntityService, TestEntity, TestResource>() {} 创建它,那就行得通了。