在使用另一个接口扩展接口时,是否应该指定泛型类型的具体类型?
我的意思是,如果我有一个界面:
public interface Repo<T>{
Collection<T> search(String params);
T get(String id);
}
Run Code Online (Sandbox Code Playgroud)
然后是一堆特定的存储库,比如ClientRepo,CustomerRepo等...... 在扩展此接口时指定类型T是合理的,例如:
public interface ClientRepo extends Repo<Client>{
}
public interface CustomerRepo extends Repo<Customer>{
}
Run Code Online (Sandbox Code Playgroud)
客户和客户只是某些类.
有没有人有类似的问题?我的意思是我能做到:
public interface ClientRepo<T> extends Repo<T>{
}
Run Code Online (Sandbox Code Playgroud)
附录:也许我应该让我更清楚地了解具体的Repos(例如ClientRepo).还有另一个名为RepoFactory的接口,它将适当的Repo返回给客户端,例如:
public interface RepoFactory{
ClientRepo createClientRepo();
CustomerRepo createCustomerRepo();
}
Run Code Online (Sandbox Code Playgroud)
该工厂由实现者实现,实现者反过来提供具体Repos的适当实现.
事实上,从上面你可以说api的客户端没有使用接口Repo <T>.
我希望有足够的困惑!对不起:(
我发现这样做有更多用处
public interface SomeRepo<T> extends Repo<T>{
}
Run Code Online (Sandbox Code Playgroud)
比通过扩展接口
public interface ClientRepo extends Repo<Client>{
}
public interface CustomerRepo extends Repo<Customer>{
}
Run Code Online (Sandbox Code Playgroud)
也就是说,我过去已经做过这两件事,并且将来很可能会同时做这两件事。如果您在后一个解决方案中检测到太多重复代码,我会尽力将其替换为前一个解决方案。
如果你想要任何实际问题,编译器似乎很难意识到“公共接口 ClientRepo 扩展 Repo”可以与 Repo 兼容。这种情况不会经常发生(但是当它发生时,需要多次尝试才能使泛型接口正确)。
事实证明,我正在寻找的解决方案只是扔掉所有专用接口:
public interface RepoFactory{
Repo<Client> createClientRepo();
Repo<Customer> createCustomerRepo(); }
Run Code Online (Sandbox Code Playgroud)
这样我既可以保留静态类型检查来强制执行 API,又可以为工厂的实现获得额外的灵活性。