如何使用 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>() {}
创建它,那就行得通了。
我正在尝试使用 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>() {}
创建它,那就行得通了。