Java 如何使用Google';s番石榴图书馆
我正在尝试使用Google的Guava TypeToken库查找泛型类型。我无法找到使用正确参数提取所需类型的实际调用Java 如何使用Google';s番石榴图书馆,java,generics,types,guava,Java,Generics,Types,Guava,我正在尝试使用Google的Guava TypeToken库查找泛型类型。我无法找到使用正确参数提取所需类型的实际调用 public class BaseEntity { } public class BaseResource { } public class EntityService<E extends BaseEntity, R extends BaseResource> { } public class TestEntity extends BaseEntity { } p
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();
公共类基实体{}
公共类基类资源{}
公共类EntityService{}
公共类TestEntity扩展了BaseEntity{}
公共类TestResource扩展了BaseResource{}
公共类TestEntityService扩展了EntityService{}
公共类EntityRqlPredicateBuilder<
S扩展实体服务,
E.实体,
R扩展基本资源>
{
EntityRqlPredicateBuilder(){
//我想获取E的类类型(即TestEntity.class)
类entityClass=???
}
}
//在代码中,使用EntityRsqlPredicateBuilder
EntityRqlPredicateBuilder=新的EntityRqlPredicateBuilder();
我的备份策略只是将类传递到EntitySqlPredicateBuilder。然而,当类型应该已知时,这似乎是代码重复
感谢您提出的任何建议。TypeToken无法按照您尝试的方式完成您想做的事情,任何事情都做不到。由于类型擦除,当前编写代码的方式将不可避免地丢失这些信息 然而,
TypeToken
文档确实向您展示了如何做一些与您尝试做的事情相近的事情:
使用(通常是匿名的)子类捕获泛型类型,并根据知道类型参数的上下文类解析它。例如:
抽象类IKnowMyType{
TypeToken类型=新的TypeToken(getClass()){};
}
新的IKnowMyType(){}.type=>String
因此,如果您将
EntitySqlPredicateBuilder
抽象化,然后使用new EntitySqlPredicateBuilder(){}
创建它,这就行了。TypeToken无法以您尝试的方式完成您尝试完成的任务——没有任何东西可以做到。由于类型擦除,当前编写代码的方式将不可避免地丢失这些信息
然而,TypeToken
文档确实向您展示了如何做一些与您尝试做的事情相近的事情:
使用(通常是匿名的)子类捕获泛型类型,并根据知道类型参数的上下文类解析它。例如:
抽象类IKnowMyType{
TypeToken类型=新的TypeToken(getClass()){};
}
新的IKnowMyType(){}.type=>String
因此,如果您将
EntitySqlPredicateBuilder
抽象化,然后使用新的EntitySqlPredicateBuilder(){}
创建它,那就行了。可能是重复的,尽管我希望使用Guava TypeToken可以得到更好的答案。我认为Louis下面的答案提供了一个更简单的解决方案,但与您提供的链接中列出的解决方案具有相同的限制(使用匿名子类)。可能是重复的,尽管我希望使用Guava TypeToken获得更好的答案。我认为Louis下面的答案提供了一个更简单的解决方案,但与您提供的链接中列出的解决方案具有相同的限制(使用匿名子类)。这确实有效。但是,尝试确定生成的接口是否更好。一方面,用户需要创建一个匿名子类,并在编写时指定参数;另一方面,客户端需要在构造函数参数中传递类(例如,new EntitySqlPredicateBuilder(TestEntityService.class、TestEntity.class、TestResource.class),假设需要知道所有三种类类型。这确实有效。但是,尝试确定生成的接口是否更好。一方面,用户需要创建一个匿名子类并在编写时指定参数,另一方面,客户端需要在构造函数参数中传递类(例如,新的EntitySqlPredicteBuilder(TestEntityService.class、TestEntityity.class、TestResource.class),假设需要知道所有三种类类型。
abstract class IKnowMyType<T> {
TypeToken<T> type = new TypeToken<T>(getClass()) {};
}
new IKnowMyType<String>() {}.type => String