将类型T的对象插入到通用列表中

时间:2018-04-03 18:26:00

标签: java arrays generics

注意:这是我测试的一部分。我的目标是自己实现ListArray,表示listarray应该能够存储任意类型的对象。我不允许使用已存在的任何其他库类,如LinkedList或ListArray,我不允许抛弃数组并实现Collection。我必须实现一个通用的排序数组。

下面的代码编译,所以我假设构造函数工作。问题是,当测试断言listArray [0]是否等于list.append(1)时,我得到一个nullPointerException。我认为问题是我需要创建一个新的Object并将其插入到数组中,问题是我不知道Object T会是什么,因此我不知道如何创建它带参数的新T"元素"。

public class List<T> implements Seq<T> {

public T[] listArray;
public int size;
public int freeIndex;

public List(){
    this.listArray = (T[])new Object[10];
    this.size = 10;
    this.freeIndex = 0;
}

//have to create a new object
public void append(T element){
    this.listArray[0] = element; //need some sort of new T() method.
}
}

UPDATE 我意识到append缺乏功能,这就是意图,我只专注于将任意对象T插入数组。

UPDATE1 我过于专注于泛型而错过了我的构造函数被错误编写。如果它看起来很懒,我道歉,我一直试图解决这个问题几个小时但是唉,我在Java方面缺乏经验。尽管如此,我还是回答了将元素加入泛型数组的问题。谢谢。

2 个答案:

答案 0 :(得分:1)

如果您尝试调试,您​​会看到this.listArray为null。 可能你对public void List()的意图是构造函数,但它不是构造函数。这是普通的方法。是public List()(没有返回类型)。

您绝对不需要new T() method来解决此问题(有可能,请参阅Create instance of generic type in Java?)。

最后,您很快就会发现您的追加方法与其他“放在第一个位置”没有任何关系。为了完成追加实施,您需要

  • 更新freeIndex
  • 调整数组大小,如果它太小而不适合新元素

你真的不需要size作为成员变量,你可以依赖listArray.length。

答案 1 :(得分:-1)

插入

时需要增加数组索引
public class List<T> implements Seq<T> {

    private int incrementSize = 10;
    private T[] listArray = new T[incrementSize];
    private int size = 10;
    private int freeIndex = 0;

    public List(){
    }

    //have to create a new object
    public void append(T element){
        this.listArray[freeIndex] = element; //need some sort of new T() method.
        freeIndex++;
        if (freeIndex >= size) {
            increaseArraySize();
        }
    }

    private void increaseArraySize() {
        // create a new array with incrementSize extra buckets
        // copy old array into new array
        // point old array at new array
        // increment size
    }
}