在接口扩展中指定generics

在使用另一个接口扩展接口时,是否应该指定generics类型的具体类型?

我的意思是,如果我有一个界面:

public interface Repo{ Collection search(String params); T get(String id); } 

然后是一堆特定的存储库,如ClientRepoCustomerRepo等……扩展此接口时指定类型T是合理的,例如:

 public interface ClientRepo extends Repo{ } public interface CustomerRepo extends Repo{ } 

客户和客户只是某些类。

有没有人有类似的问题? 我的意思是我能做到:

 public interface ClientRepo extends Repo{ } 

附录 :也许我应该让我更清楚地了解具体的Repos(例如ClientRepo)。 还有另一个名为RepoFactory的接口, 它将适当的Repo返回给客户端,例如:

 public interface RepoFactory{ ClientRepo createClientRepo(); CustomerRepo createCustomerRepo(); } 

该工厂由实现者实现 ,实现者反过来提供具体Repos的适当实现。

事实上,从上面你可以说api的客户端没有使用接口Repo

让我感到困惑,希望! 对不起:(

嗯,这取决于你的扩展接口/类是否也是通用的。 在你的例子中,我会假设你想做

 public interface ClientRepo extends Repo{ } 

因为有

 public interface ClientRepo extends Repo{ } 

你可以做的事情

 ClientRepo 

这可能不是理想的行为。

我发现在做的事情上有很多实用性

 public interface SomeRepo extends Repo{ } 

比通过扩展接口

 public interface ClientRepo extends Repo{ } public interface CustomerRepo extends Repo{ } 

也就是说,我过去都做过这两件事,并且很可能会在未来做到这两件事。 如果在后一种解决方案中检测到过多的重复代码,我会尽力用以前的解决方案替换它。

如果你想要任何实际问题,似乎编译器很难意识到“公共接口ClientRepo扩展Repo”可以与Repo兼容。 它不会经常发生(但是当它发生时需要多次尝试才能使generics接口正确)。

通用接口(以及整体上的generics)的目的是具有单个通用实现。 即,即使您的接口可能有多个实现,它们也应该处理每个有效的参数类。

如果删除后续接口层中的参数,那么首先就会失去创建通用接口的想法。 毕竟,你可以简单地做:

  public interface Repo { Collection search(String params); Object get(String id); } public interface ClientRepo { Collection search(String params); Client get(String id); } 

当然,如果您的外部代码支持任何Repo实现的参数化操作,那么拥有通用接口仍然有用。 但您也可以争辩说这些操作应该是Repo界面的一部分。

总而言之,它是可行的并且不难certificate,但对我来说看起来有点尴尬:仅仅通过查看你的例子,很难弄清楚你的意图是什么,这总是警告的标志。

您可以正确定义类型

 interface BaseType { } interface Client extends BaseType {} 

然后,你可以定义

 interface Repo { Collection search(String params); T get(String id); } interface ClientRepo extends Repo { } 

并实施

 ClientRepo c = new ClientRepo() { @Override public Collection search(String params) {// implementation here } @Override public Client get(String id) {// implementation here } }; 

获得更严格的类型检查。

事实certificate我正在寻找的解决方案只是抛弃我所有的专用接口:

 public interface RepoFactory{ Repo createClientRepo(); Repo createCustomerRepo(); } 

这样我就可以保持静态类型检查以强制执行api,并为我的Factory的实现获得额外的灵活性。