Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Google';s番石榴图书馆_Java_Generics_Types_Guava - Fatal编程技术网

Java 如何使用Google';s番石榴图书馆

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

我正在尝试使用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();
公共类基实体{}
公共类基类资源{}
公共类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