如何使用Java方法将Object添加到Generic数组

时间:2015-02-19 03:20:46

标签: java arrays oop generics

我想在我的数组中添加一个对象。我正在尝试创建一个方法,所以每当它被调用时,它都会添加泛型类型对象。这是我的代码:

public class ArrayObjects<E> implements SomeImp<E>{

    private E[] list;

    private int maxCapacity, currentSize;

    public ArrayObjects(){
        maxCapacity = 10;
        array = (E[]) new Object[maxCapacity];
    }

    public void addObj(E obj){
        array.add(obj); //Throws an error
    }
}

Eclipse虽然显示了一个错误。它说“无法在数组类型E []”

上调用add(E)

有谁知道为什么会这样?您是否知道将对象添加到我的通用数组的替代方法?

谢谢!


编辑:

当我创建一个实例化ArrayObjects的类的实例,并尝试向其添加值时,它不会这样做。代码:

import packageWhereArrayObjectsIs.*;


public class Test {
    private ArrayObjects<Integer> list;

    public Test() {
        list = new ArrayObjects<Integer>();    
        Test();
        }

    private void TestOne() { 
        for(int i=1; i <= 10; i++)
            list.addLast(i);         
        System.out.println("Should print 1 .. 10");
        System.out.println(list);

    }
}

2 个答案:

答案 0 :(得分:1)

数组不存在方法add()。您必须使用正确的语法[]

访问数组元素
    public void addLast(E obj) {
        array[currentSize++] = obj;
    }

为了让您的列表打印得非常好,您需要在toString()课程中添加ArrayObjects方法:

    public String toString() {
        return Arrays.toString(array);
    }

要迭代ArrayObjects的元素,您可以实现Iterable界面:

public class ArrayObjects<E> implements Iterable<E>

这要求您的班级使用iterator()方法返回Iterator

    public Iterator<E> iterator() {
        class It implements Iterator<E>
        {
            int position = -1;
            public boolean hasNext() {
                return position + 1 < currentSize;
            }
            public E next() {
                return array[++position];
            }
            public void remove() {
                throw new UnsupportedOperationException();
            }
        }
        return new It();
    }

最后,此代码显示了如何使用增强的for循环迭代列表:

        ArrayObjects<Integer> list = new ArrayObjects<Integer>();
        for (int i = 0; i < 10; i++) list.addLast(i);
        for (Integer i: list) {
            System.out.println("Iterating over list! Next element is " + i);
        }

答案 1 :(得分:0)

你应该做这样的事情,假设当你添加你的第一个元素时你的实际大小是1 但是这个位置将是0因为它是第一个位置数组。

public boolean addObj(E obj){

    if(actualSize == maxCapacity){
        return false;
    }

    array[actualSize--] = obj;

    return true;
}

如果数组中没有剩余位置,我将返回值更改为false(假设您不会删除中间的任何对象)。

为什么需要阵列?为什么不选择List

public class ArrayObjects<E> implements SomeImp<E>{

private List<E> list;

private int maxCapacity;

public ArrayObjects(){
    maxCapacity = 10;
    list = new ArrayList<E>();
}

public boolean addObj(E obj){

    if(list.size() == maxCapacity){
        return false;
    }

    list.add(obj);

    return true;
}
}

使用列表查看您不必处理actualSize

编辑:正如Smac89指出的那样,使用列表是没有意义的。但请记住,如果数组未满,则必须找到一个空位。