首页 / JAVA / java界面泛型投射问题
java界面泛型投射问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java界面泛型投射问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1568字,纯文字阅读大概需要3分钟。
内容图文
类型List中的方法add(capture#2-of?extends IObject)不适用于参数(IDerived)
protected List<? extends IObject> getObjects()
{
List<? extends IObject> objects = new ArrayList<IObject>();
for (String id: item_ids)
{
IDerived object = (IDerived) readObject(id);
objects.add(object); #error
}
return objects;
}
interface IDerived extends interface IVersionedObject extends interface IObject
如果我将对象的类型更改为List,则错误消失,这没有任何意义,因为它必须对函数返回类型进行完全相同的强制转换.
解决方法:
试试这个:
protected <T extends IObject> List<T> getObjects() {
List<T> objects = new ArrayList<T>();
for (String id: item_ids)
{
T object = (T) readObject(id);
objects.add(object); // NO error
}
return objects;
}
编辑(简短说明):
这样,你的方法可以适用于IObject的任何子类型(里面的列表和强制转换都是通用的),返回类型将从调用者的期望中推断出来(正如你明显的意图).
在回复注释时,您现在可以通过以下方式调用getObjects()方法:
// This should only be used if readObject() behaves like
// getObjects() and is able to return any requested subtype.
// Otherwise, you'll get a ClassCastException when trying to get
// something from the derivedList in case readObject() put something
// else there (which is not a subtype of IDerived).
List<IDerived> derivedList = getObjects();
// This is the safe way to go in case you don't have
// full control over what readObject() returns.
// But if you're using it like this (all the time), you'd better
// return List<IObject> from getObjects() and get rid
// of generics.
List<? extends IObject> objectList1 = getObjects();
List<IObject> objectList2 = getObjects();
内容总结
以上是互联网集市为您收集整理的java界面泛型投射问题全部内容,希望文章能够帮你解决java界面泛型投射问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。