Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型问题_Java_Generics - Fatal编程技术网

Java泛型问题

Java泛型问题,java,generics,Java,Generics,试图泛型一些遗留代码,我被卡住了。我有一个ParentObject,它包装了一个ChildObject,以提供对ChildObject的组类型操作。最有用的是,它允许在子对象集合上进行迭代。 当我尝试向混合中添加一些泛型时,我无法解决如何使迭代器方法在没有“命名冲突”错误或在下面的示例中出现“返回类型与Iterable.iterator()不兼容”错误的情况下友好运行。 有什么建议吗?(额外的问题-除了抑制警告之外,还有没有更好的方法来编写avoid thegetChildObjectByInd

试图泛型一些遗留代码,我被卡住了。我有一个ParentObject,它包装了一个ChildObject,以提供对ChildObject的组类型操作。最有用的是,它允许在子对象集合上进行迭代。 当我尝试向混合中添加一些泛型时,我无法解决如何使迭代器方法在没有“命名冲突”错误或在下面的示例中出现“返回类型与Iterable.iterator()不兼容”错误的情况下友好运行。 有什么建议吗?(额外的问题-除了抑制警告之外,还有没有更好的方法来编写avoid thegetChildObjectByIndex()方法来避免类型擦除编译器警告?) 事先非常感谢您的帮助

public class ParentObject implements Iterable<ChildObject> {  
    protected List<? super ChildObject> theChildObjects;  

    @SuppressWarnings("unchecked")  
    public <T extends ChildObject> T getChildObjectByIndex(int idx) {  
        return (T)theChildObjects.get(idx);  
    }  

    public Iterator<? super ChildObject> iterator() {  
        return java.util.Collections.unmodifiableCollection(this.theChildObjects).iterator();  
    }  

}
公共类ParentObject实现了Iterable{

受保护列表如果ParentObject仅包含一个子类型的ChildObject,则可以对该类型的ParentObject进行参数化:

public class ParentObject<T extends ChildObject> implements Iterable<T> {
    protected List<T> theChildObjects;

    public T getChildObjectByIndex(int idx) {
        return theChildObjects.get(idx);
    }

    public Iterator<T> iterator() {
        return java.util.Collections.unmodifiableCollection(this.theChildObjects).iterator();
    }
}
公共类ParentObject实现了Iterable{
受保护的儿童项目清单;
公共T getChildObjectByIndex(int idx){
返回childobjects.get(idx);
}
公共迭代器迭代器(){
返回java.util.Collections.unmodifiableCollection(this.theChildObjects.iterator();
}
}

在您的示例中,ParentObject似乎是某种与ChildObject没有关系的容器类。ChildObject是否扩展了ParentObject?如果是,这似乎不太理想。而且,您似乎应该使用“扩展”在泛型中而不是超级中,除非我只是误解了你想要做的事情。下面呢?或者这对你想要做的事情来说太简单了

public class WidgetContainer<T> implements Iterable<T> {
    protected List<T> theWidgets;

    public T getWidgetByIndex(int idx) {
        return theWidgets.get(idx);
    }

    public Iterator<T> iterator() {
        return Collections.unmodifiableCollection(theWidgets).iterator();
    }
}

WidgetContainer<SomeWidget> myWidgetContainer = new WidgetContainer<SomeWidget>();
公共类WidgetContainer实现Iterable{
受保护的小部件列表;
公共T getWidgetByIndex(int idx){
返回widgets.get(idx);
}
公共迭代器迭代器(){
返回Collections.unmodifiableCollection(theWidgets).iterator();
}
}
WidgetContainer myWidgetContainer=新的WidgetContainer();

此外,我可能会缓存不可修改集合的副本,并在每次需要迭代器时使用它,而不是动态构造迭代器。

这些
?super
T extends
是绝对必要的吗?如果不是,只需删除它们。否则,请更新您的问题,以澄清关于这些必要性的功能设计要求e、 只有这样,我们才能建议最合适的泛型。根据您的描述,我愿意打赌
super
并不是您认为它的意思。您会赢的,但不会再赢了……这就是答案!对于我第一次涉猎泛型类,我的错误是没有理解您定义泛型的事实只需在类级别键入一次。我从列表开始向上工作,完全弄糊涂了。关于缓存不可修改的集合-所有这些集合。不可修改的集合()确实是给你一个指向内存中原始对象的指针,但是当你调用一个变异的收集方法时,它会抛出一个不受支持的异常。收集对象不是克隆或复制的,因此它本质上是一个廉价的操作。由于我的列表是可变的,我认为管理缓存副本以保持同步的开销将是巨大的比每次获取一个新的不可修改的集合更昂贵。有什么想法吗?据我所知,Collections.*方法返回包装原始集合的新集合,抛出所有变异操作的异常,并将其余操作委托给原始集合。如果是这样的话,那么您实际上是在创建一个新集合每次有人调用迭代器()时,都使用w包装器类方法。如果要对集合进行变异,我的建议是存储两个副本:需要更改时使用的原始未包装版本,以及需要传回迭代器时使用的包装不可变版本。旁注:让容器类扩展其中一个c集合类,如ArrayList,然后覆盖您想要更改的方法(如迭代器)。您的类可以存储不可变的“版本”当需要传回不可变迭代器时,在内部使用。由于不可变包装器由原始集合支持,因此它将反映您对原始集合所做的任何更改。