List的Java泛型返回从多个接口继承的方法的类型
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了List的Java泛型返回从多个接口继承的方法的类型,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3541字,纯文字阅读大概需要6分钟。
内容图文
![List的Java泛型返回从多个接口继承的方法的类型](/upload/InfoBanner/zyjiaocheng/693/33c7674e9b6748998b6b502022246464.jpg)
我目前在一家拥有各种模块的公司工作.在该公司中,如果您想提供模块内部,则可以通过java接口提供它,该接口隐藏实际的实现类型并为请求模块提供接口.现在,我希望有一个提供程序能够为暴露实际内部数据的不同字段或方法的多个模块提供数据.
因此,我有一个内部对象,其中包含一些数据,并且每个模块都有一个接口,需要访问某些但不是严格的所有字段.最后,我有一个实现所有这些接口的外部对象,并拥有内部对象的实例以委派方法调用:
public class InternalObject {
public int getA() { return 0; }
public int getB() { return 0; }
}
public interface ModuleXObject {
int getA();
}
public interface ModuleYObject {
int getA();
int getB();
}
public class ExternalObject implements ModuleXObject, ModuleYObject {
private InternalObject _internal;
public int getA() { return _internal.getA(); }
public int getB() { return _internal.getB(); }
}
现在一切都很好,但如果我想提供-可以说-用于查找为正确模块键入的所述对象列表的存储库方法,我会遇到如何实现该目标的问题.我希望有以下类似的东西:
public interface ModuleXObjectRepository {
List<ModuleXObject> loadAllObjects();
}
public interface ModuleYObjectRepository {
List<ModuleYObject> loadAllObjects();
}
public class ExternalObjectRepository implements ModuleXObjectRepository, ModuleYObjectRepository {
public List<ExternalObject> loadAllObjects() {
// ...
}
}
这并不表示返回类型不兼容.
所以我的问题是,是否有可能实现类似目标,以及如何实现?
我应该注意,我尝试了一些不同的方法,这些方法为了完整性和描述它们的缺点(在我看来).
方法1:
public interface ModuleXObjectRepository {
List<? extends ModuleXObject> loadAllObjects();
}
public interface ModuleYObjectRepository {
List<? extends ModuleYObject> loadAllObjects();
}
public class ExternalObjectRepository implements ModuleXObjectRepository, ModuleYObjectRepository {
public List<ExternalObject> loadAllObjects() {
// ...
}
}
这种方法与我希望的解决方案非常接近,但结果是这样的代码:
List<? extends ModuleXObject> objects = repository.loadAllObjects();
因此,要求用户在有关调用loadAllObjects()的每个List-Declaration中包括“?extends”.
方法二:
public interface ModuleXObjectRepository {
List<ModuleXObject> loadAllObjects();
}
public interface ModuleYObjectRepository {
List<ModuleYObject> loadAllObjects();
}
public class ExternalObjectRepository implements ModuleXObjectRepository, ModuleYObjectRepository {
public List loadAllObjects() {
// ...
}
}
我认为这种方法只是忽略了ExternalObjectRepository中的泛型,因此大大降低了类型安全性.另外我还没有测试这是否真的有效.
只是为了提醒大家,是否有任何可能的方式来定义loadAllObjects方法,该方法使用户能够获取使用其各自模块的对象键入的列表,而无需
>在用户代码中要求“?extends”
>在存储库实现中降低类型安全性
>使用类/接口级别的泛型
解决方法:
允许将其键入为List< ModuleXObject>的挑战. List可以保留的其他代码是List< ExternalObject>.
所有ExternalObject实例都是ModuleXObject实例,但反之则不成立.
考虑以下附加类:
public class MonkeyWrench implements ModuleXObject{
//STUFF
}
MonkeyWrench实例不是ExternalObject实例,但是如果可以将List< ExternalObject>到List< ModuleXObject>可以将MonkeyWrench实例添加到此集合中,这会导致运行时类强制转换异常并破坏类型安全性.
其他代码很容易拥有:
for(ExternalObject externalObject:externalObjectRepository.loadAllObjects())
如果这些实例之一是MonkeyWrench实例,请执行运行时类强制转换,这是泛型要避免的.
暗示?对ModuleXObject的扩展是,您可以将其作为ModuleXObject从集合中读取任何对象,但不能向集合中添加任何内容,因为其他代码可能对集合具有其他约束,这些约束在编译时不明显/不可用.
我建议在您的情况下使用?扩展ModuleXObject,因为其语义似乎与您想要的一致,即拔出ModuleXObject实例,例如
ModuleXObjectRepository repo = //get repo however
for(ModuleXObject obj : repo.loadAllObjects()){
//do stuff with obj
}
内容总结
以上是互联网集市为您收集整理的List的Java泛型返回从多个接口继承的方法的类型全部内容,希望文章能够帮你解决List的Java泛型返回从多个接口继承的方法的类型所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。