gpt4 book ai didi

java - 为泛型的实现类的子类变量提供扩展功能

转载 作者:行者123 更新时间:2023-12-01 19:33:11 27 4
gpt4 key购买 nike

我是泛型新手,正在深入研究基本上远远超出我知识范围的事情,所以请耐心等待。也许我问的很愚蠢,但我似乎无法找到关于我想做的事情是否可能的明确答案,也许是因为我不知道要寻找的正确术语。

我有两个 Java 类,它们使用类型 T 的实体进行参数化 - 存储库和服务。由于我的所有存储库和所有服务都将执行一些相同的基本任务,因此我的通用存储库和服务已经实现了所述任务,并通过 protected 功能将它们提供给任何扩展它们的东西。到目前为止,一切都很顺利。目前它们看起来像这样:

存储库类:

public interface GenericRepo<T> {
protected T findObject();
}

服务等级:

public class GenericService<T> {
private GenericRepo<T> repo;

public GenericService(GenericRepo<T> repo) {
this.repo = repo;
}

protected T findObject() {
return this.repo.findObject();
}
}

当我希望扩展我的服务并允许人们使用存储库的子类时,问题就出现了。虽然许多实体是基本的,并且通用功能涵盖了功能,但有时需要特殊情况才能对实体执行附加功能。在设置中,存储库被实现/扩展,然后该扩展类被传递给服务(服务接受它,因为它是 GenericRepo<T> 的类型)。具体的存储库如下所示:

public class ExtendedRepo implements GenericRepo<Entity> {
protected Entity findObjectByWeirdKeyOnEntity(String weirdKey) {
//awesome code that does stuff here
}
}

我还将该服务声明为通用服务,因为该服务也有很多自定义功能的可能性。所以,GenericService也可以如下扩展:

public class ExtendedService extends GenericService<Entity> {
public ExtendedService(ExtendedRepo repo) {
super(repo);
}

public Entity findObjectByWeirdKeyOnEntity() {
// Do stuff to generate weird key to search by
return this.repo.findObjectByWeirdKeyOnEntity(weirdKey);
}
}

这使我能够在服务上执行自定义功能,而且还可以利用通用服务上的所有基本功能,而无需复制代码。然而,因为变量repoGenericService声明为类型 GenericRepo<T> ,只有那些实际上属于 GenericRepo<T> 类型的函数可用于通用服务类和/或扩展它的任何内容。因此,尽管我正在通过ExtendedRepo给我的ExtendedService其父类(super class)已创建并提供 GenericRepo 的实例。通过 ExtendedRepo 的子类进行类,我无法在 GenericService 上使用声明的变量调用 ExtendedRepo 上的任何函数。 上面代码块中的代码失败 - this.repo不知道该功能findObjectByWeirdKeyOnEntity因为它是 GenericRepo<T> 类型的变量。目前,要在扩展存储库上使用任何自定义函数,我已执行以下操作:

public class ExtendedService extends GenericService<Entity> {
private ExtendedRepo extendedRepo;

public ExtendedService(ExtendedRepo repo) {
super(repo);
this.extendedRepo = repo;
}

public Entity findObjectByWeirdKey() {
return this.extendedRepo.findObjectByWeirdKeyOnEntity(weirdKey);
}
}

在扩展服务中为存储库重新声明并保留一个单独的变量似乎是错误的,因为我本质上保留了同一类的两个实例,这样我就可以在扩展类中使用一个自定义函数,同时还可以使用所有常用功能 super 类的。有没有办法创建变量 GenericRepoGenericService可以是任何扩展 GenericRepo 的类型这将允许类扩展 GenericServiceGenericRepo 的扩展版本上使用自定义方法类?

最佳答案

您可以向 GenericService 添加一个类型参数,该参数将代表 GenericRepo 的类型:

public class GenericService<R extends GenericRepo<T>, T> {
protected R repo;

public GenericService(R repo) {
this.repo = repo;
}

protected T findObject() {
return this.repo.findObject();
}
}

public class ExtendedService extends GenericService<ExtendedRepo, Entity> {
public ExtendedService(ExtendedRepo repo) {
super(repo);
}

public Entity findObjectByWeirdKeyOnEntity(String weirdKey) {
return this.repo.findObjectByWeirdKeyOnEntity(weirdKey);
}
}
<小时/>

注意:在上一个示例中,您保留了对同一实例的两个引用,但不是同一类的两个实例

关于java - 为泛型的实现类的子类变量提供扩展功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58895382/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com