Java 在p:datatable中使用自定义集合

Java 在p:datatable中使用自定义集合,java,jsf-2,primefaces,Java,Jsf 2,Primefaces,我正在尝试为我的p:datatable使用自定义集合 自定义集合: public class ManagedArrayList<E> extends java.util.ArrayList<E> { private static final int DEFAULT_SIZE_LIMIT = 0; //unlimited private ArrayList<E> internalList; private int maxSize; public Manage

我正在尝试为我的p:datatable使用自定义集合

自定义集合:

public class ManagedArrayList<E> extends java.util.ArrayList<E> {

private static final int DEFAULT_SIZE_LIMIT = 0; //unlimited
private ArrayList<E> internalList;
private int maxSize;

public ManagedArrayList(int maxSize) {
    this.maxSize = maxSize;
    internalList = new ArrayList<E> ();
}

public ManagedArrayList() {
    this(DEFAULT_SIZE_LIMIT);
}

@Override
public boolean add(E objectToAdd){
    if(maxSize>0){
        if(internalList.size()>maxSize){
            throw new IllegalStateException("List is full");
        }
    }
    return internalList.add(objectToAdd);
}

@Override
public E get(int index){
    return internalList.get(index);
}

@Override
public E remove(int index){
    return internalList.remove(index);
}

@Override
public boolean remove(Object o){
    return internalList.remove(o);
}

@Override
public Iterator<E> iterator(){
    return internalList.iterator();
}

public List<E> toList(){
    return (List)internalList;
}
}
然而,当我按原样使用它时,我得到的信息是:找不到任何记录。 如果我将我的自定义列表转换为第一个,它就可以正常工作。 转换我的列表:

private ManagedArrayList<FragmentTuple> fragments = new ManagedArrayList();

public List<FragmentTuple> getUICompatibleFragments() {
    List<FragmentTuple> f = this.fragments.toList();
    return f;
}

我更愿意直接使用我的自定义集合,而不必转换。在我的ManagedArrayList实现中是否缺少一些东西,以便它可以在p:datatable中工作,最好在ui:repeat中也可以工作。您忘了覆盖其他方法和方法。此外,您永远不会委托给ArrayList超类,而是保留一个内部ArrayList实例。人们可能会想,为什么要从ArrayList扩展,而不是甚至扩展,这反过来会自动迫使您实现正确的方法。因此,另一种选择是委托给ArrayList超类,而不是内部实例,这样size和isEmpty调用将自动返回正确的值。

Hi感谢您的提示。如何委托给超类?我最终添加了公共int size{return internalList.size;}public boolean isEmpty{return internalList.isEmpty;}并扩展了AbstractList而不是ArrayList。现在一切正常,谢谢。至于授权给super,只需将internalList.xxx替换为super.xxx,并去掉整个字段。